C -> JavaScript
От: Victor1  
Дата: 08.12.06 14:32
Оценка:
Здравствуйте, у меня такая проблема как передать иассив строк из cpp в JavaScript? Я заполняю SAFEARRAY элеменитами BSTR. А вот как быть дальше я пока не понимаю. Возможно кто-то уже сталкивался с такой проблемой. Заранее спасибо.
Re: C -> JavaScript
От: Tom Россия http://www.RSDN.ru
Дата: 08.12.06 15:03
Оценка:
Здравствуйте, Victor1, Вы писали:

V>Здравствуйте, у меня такая проблема как передать иассив строк из cpp в JavaScript? Я заполняю SAFEARRAY элеменитами BSTR. А вот как быть дальше я пока не понимаю. Возможно кто-то уже сталкивался с такой проблемой. Заранее спасибо.


Дальше надо создать COM обьект и в методе вернуть массив, и вызвать твой COM обьект в JavaScript-е
Народная мудрось
всем все никому ничего(с).
Re[2]: C -> JavaScript
От: Victor1  
Дата: 08.12.06 15:07
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Здравствуйте, Victor1, Вы писали:


V>>Здравствуйте, у меня такая проблема как передать иассив строк из cpp в JavaScript? Я заполняю SAFEARRAY элеменитами BSTR. А вот как быть дальше я пока не понимаю. Возможно кто-то уже сталкивался с такой проблемой. Заранее спасибо.


Tom>Дальше надо создать COM обьект и в методе вернуть массив, и вызвать твой COM обьект в JavaScript-е


Насчет COM я понял. Нет ли у Вас примера решения подобного вопроса?
Re[3]: C -> JavaScript
От: Tom Россия http://www.RSDN.ru
Дата: 08.12.06 15:20
Оценка:
V>Насчет COM я понял. Нет ли у Вас примера решения подобного вопроса?

Как то так:
    STDMETHODIMP MyCoolComObject::PleaseGiveMeTheArray(
        SAFEARRAY** ppsa);
    {
        *ppsa  = 0;

        SAFEARRAY* psa = SafeArrayCreateVector(VT_BSTR, 0 2);
        
        LONG Index = 0;
        SafeArrayPutElement(psa, &Index, CComBSTR(L"Item0"));

        Index = 1;
        SafeArrayPutElement(psa, &Index, CComBSTR(L"Item1"));

        *ppsa = psa;

        return S_OK;
    }
Народная мудрось
всем все никому ничего(с).
Re[3]: C -> JavaScript
От: algol Россия about:blank
Дата: 08.12.06 15:42
Оценка: +1
Здравствуйте, Victor1, Вы писали:

V>Насчет COM я понял. Нет ли у Вас примера решения подобного вопроса?


Еще учтите, что вы получите не javascript-овый array, а VB safe array. Получить доступ к его элементам можно через объект VBArray, а метод toArray() конвертирует его в стандартный javascript array.
Re[4]: C -> JavaScript
От: Victor1  
Дата: 08.12.06 15:47
Оценка:
Здравствуйте, Tom, Вы писали:

V>>Насчет COM я понял. Нет ли у Вас примера решения подобного вопроса?


Tom>Как то так:

Tom>
Tom>    STDMETHODIMP MyCoolComObject::PleaseGiveMeTheArray(
Tom>        SAFEARRAY** ppsa);
Tom>    {
Tom>        *ppsa  = 0;

Tom>        SAFEARRAY* psa = SafeArrayCreateVector(VT_BSTR, 0 2);
        
Tom>        LONG Index = 0;
Tom>        SafeArrayPutElement(psa, &Index, CComBSTR(L"Item0"));

Tom>        Index = 1;
Tom>        SafeArrayPutElement(psa, &Index, CComBSTR(L"Item1"));

Tom>        *ppsa = psa;

Tom>        return S_OK;
Tom>    }
Tom>


То есть как я понял, я формирую psa, который потом должен вызвать в JavaScripte?. Соответсвенно, в JavaScripte, один из параметров функции должен быть массивом. Так?
Re[5]: C -> JavaScript
От: George Seryakov Россия  
Дата: 08.12.06 16:49
Оценка:
Здравствуйте, Victor1, Вы писали:

V>То есть как я понял, я формирую psa, который потом должен вызвать в JavaScripte?. Соответсвенно, в JavaScripte, один из параметров функции должен быть массивом. Так?


Возврашаемый параметр, тот, что [out, retval]. И не массивом, а вариантом с массивом внутри. И еще, не уверен, что можно вернуть VT_ARRAY|VT_BSTR, возможно придется делать VT_ARRAY|VT_VARIANT, и уже варианты будут типа VT_BSTR.
GS
Re[6]: C -> JavaScript
От: Tom Россия http://www.RSDN.ru
Дата: 08.12.06 17:33
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Здравствуйте, Victor1, Вы писали:


V>>То есть как я понял, я формирую psa, который потом должен вызвать в JavaScripte?. Соответсвенно, в JavaScripte, один из параметров функции должен быть массивом. Так?


GS>Возврашаемый параметр, тот, что [out, retval]. И не массивом, а вариантом с массивом внутри. И еще, не уверен, что можно вернуть VT_ARRAY|VT_BSTR, возможно придется делать VT_ARRAY|VT_VARIANT, и уже варианты будут типа VT_BSTR.


Можно возвращать именно массив. Вызов то идёт через IDispatch...
Народная мудрось
всем все никому ничего(с).
Re[7]: C -> JavaScript
От: George Seryakov Россия  
Дата: 09.12.06 21:21
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Можно возвращать именно массив. Вызов то идёт через IDispatch...


Матка боска, не получается! Студия шестая.
GS
Re[8]: C -> JavaScript
От: George Seryakov Россия  
Дата: 10.12.06 01:27
Оценка: 8 (1)
Здравствуйте, George Seryakov, Вы писали:

Tom>>Можно возвращать именно массив. Вызов то идёт через IDispatch...


GS>Матка боска, не получается! Студия шестая.


Примерчик вгружен на http://rsdn.ru/File/3778/safearr.zip.
GS
Re[9]: C -> JavaScript
От: Victor1  
Дата: 11.12.06 07:35
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Здравствуйте, George Seryakov, Вы писали:


Tom>>>Можно возвращать именно массив. Вызов то идёт через IDispatch...


GS>>Матка боска, не получается! Студия шестая.


GS>Примерчик вгружен на http://rsdn.ru/File/3778/safearr.zip.


Спасибо
Re[9]: C -> JavaScript
От: Victor1  
Дата: 11.12.06 07:44
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Здравствуйте, George Seryakov, Вы писали:


Tom>>>Можно возвращать именно массив. Вызов то идёт через IDispatch...


GS>>Матка боска, не получается! Студия шестая.


GS>Примерчик вгружен на http://rsdn.ru/File/3778/safearr.zip.


Нужно, ли обязательно делать
SafeArrayDestroy()?
Re[9]: C -> JavaScript
От: Vi2 Удмуртия http://www.adem.ru
Дата: 11.12.06 07:49
Оценка: 4 (1)
Здравствуйте, George Seryakov, Вы писали:

GS>>Матка боска, не получается! Студия шестая.


Перепутал типы в описании методов с SAFEARRAY-ями.

GS>Примерчик вгружен на http://rsdn.ru/File/3778/safearr.zip.

Должно быть:
    [id(3), helpstring("method GetSA_VAR")] HRESULT GetSA_VAR([out, retval] SAFEARRAY(VARIANT) *psa);
    [id(4), helpstring("method GetSA_BSTR")] HRESULT GetSA_BSTR([out, retval] SAFEARRAY(BSTR) *psa);

потому что
STDMETHODIMP CArr::GetSA_VAR(SAFEARRAY **ppsa)
{
    SAFEARRAY* psa = SafeArrayCreateVector(VT_VARIANT, 0, 2);
...    
}

STDMETHODIMP CArr::GetSA_BSTR(SAFEARRAY **ppsa)
{
...
    SAFEARRAY* psa = SafeArrayCreateVector(VT_BSTR, 0, 2);

И работать должны массивы с типом VT_VARIANT и не работать с VT_BSTR, хотя последние верно получаются из метода в скрипт и могут передаваться далее в другие методы.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[9]: C -> JavaScript
От: Tom Россия http://www.RSDN.ru
Дата: 11.12.06 08:06
Оценка:
Здравствуйте, George Seryakov, Вы писали:

GS>Здравствуйте, George Seryakov, Вы писали:


Tom>>>Можно возвращать именно массив. Вызов то идёт через IDispatch...


GS>>Матка боска, не получается! Студия шестая.


GS>Примерчик вгружен на http://rsdn.ru/File/3778/safearr.zip.


Отец, совсем видимо склероз замучал старого маразматика SAFEARRAY(BSTR) не работает, видимо и не должен.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Народная мудрось
всем все никому ничего(с).
Re[6]: C -> JavaScript
От: Left2 Украина  
Дата: 11.12.06 08:59
Оценка:
GS>И еще, не уверен, что можно вернуть VT_ARRAY|VT_BSTR, возможно придется делать VT_ARRAY|VT_VARIANT, и уже варианты будут типа VT_BSTR.

Абсолютно верно сомневаешься — нельзя VT_ARRAY|VT_BSTR, можно только VT_ARRAY|VT_VARIANT — причём неважно какой язык — что VBScript, что JScript.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: C -> JavaScript
От: George Seryakov Россия  
Дата: 11.12.06 13:43
Оценка:
Здравствуйте, Victor1, Вы писали:

V>Нужно, ли обязательно делать

V>SafeArrayDestroy()?

В данном случае (когда массив отдается) — нет. Когда массив передается по возврату, права владения переходят вызывающему клиенту, он и должен дестроить. Подробнее см http://msdn2.microsoft.com/en-gb/library/ms686638.aspx.
GS
Re[3]: C -> JavaScript
От: BishopMorton Россия  
Дата: 11.12.06 14:39
Оценка:
Здравствуйте, Victor1, Вы писали:

V>Здравствуйте, Tom, Вы писали:


Tom>>Здравствуйте, Victor1, Вы писали:


V>>>Здравствуйте, у меня такая проблема как передать иассив строк из cpp в JavaScript? Я заполняю SAFEARRAY элеменитами BSTR. А вот как быть дальше я пока не понимаю. Возможно кто-то уже сталкивался с такой проблемой. Заранее спасибо.


Tom>>Дальше надо создать COM обьект и в методе вернуть массив, и вызвать твой COM обьект в JavaScript-е


V>Насчет COM я понял. Нет ли у Вас примера решения подобного вопроса?


Если вы можете использовать ATL, то не ломайте голову сделайте как-нибудь так

вот некий код


STDMETHODIMP CTest::GetList(VARIANT* psaList)
{
...
    CComSafeArray<VARIANT> saList;
    hVer = saList.Create();

    for ( /*ваш цикл*/  )
    {
        hVer = saList.Add( CComVariant( /*ваша BSTR строчка*/ ));
    } 

    CComVariant varList = saList;
    varList.Detach( psaList );
...
}


по моему достаточно простенько выглядит

И еще следует учитывать, что если вы собираетесь использовать ваш ком объект из скриптов то следует использовать только [out, retval] параметр для вашего массива. jscript не понимает out параметров, а vbscript понимает такие параметры только если там VARIANT, так что чтобы не было проблем лучше использовать [out, retval]
When money talks... nobody checks the grammar.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.