Проблема с возвратом значений. [out] - НЕ РАБОТАЕТ.
От: U4 Россия  
Дата: 09.06.04 16:51
Оценка:
Есть интерфейс IDsScript.

MIDL
-----------------------------------------------------------------------------
interface IDsScript : IDispatch
{
...
[id(6),vararg] HRESULT ExecQuery2([out] long* rltcd,
[out] BSTR* buf,
[in] BSTR path,
[in] BSTR ft,
[in] SAFEARRAY(VARIANT)* arg );
};

С++
----------------------------------------------------------------------------
ExecQuery2( long* rltcd, BSTR* buf, BSTR path, BSTR ft, SAFEARRAY** arg )
{
...
*buf = SysAllocString( OLESTR( "Simple String" ) );
*rltcd = 15;
return S_OK;
}


JavaScript
----------------------------------------------------------------------------
var rltcd = 0;
var buf = "";
var path = "Типовые запросы.q";

ComDs.ExecQuery2( rltcd, buf, path, "s205070.1", "~1" );


ПРОБЛЕМА. Необходима записать в переменные rltcd, buf соответственно число и строку. В отладчике видно, что по этим адресам записываются нужные значения. Однако в JavaScript после выполнения метода значение этих переменных не изменились.

Пробывал ставить [in,out], не помогло. Удается возвращать значения в JavaScript только при объявлении метода как [out,retval], но таким способом можно вернуть значение всего одной переменной, которая обязаня стоять последним параметром в списке аргументов функции. Оба этих условия мне не подходят. Может кто-нибудь знает почему не срабатывает [out], буду очень признателен.
Re: И не будет работать
От: Vi2 Удмуртия http://www.adem.ru
Дата: 10.06.04 03:50
Оценка:
Здравствуйте, U4, Вы писали:

U4>interface IDsScript : IDispatch

U4>{
U4> ...
U4> [id(6),vararg] HRESULT ExecQuery2([out] long* rltcd, [out] BSTR* buf, ... );
U4>};

U4>JavaScript

U4>...
U4>ПРОБЛЕМА. Необходима записать в переменные rltcd, buf соответственно число и строку. В отладчике видно, что по этим адресам записываются нужные значения. Однако в JavaScript после выполнения метода значение этих переменных не изменились.

U4>Пробывал ставить [in,out], не помогло. Удается возвращать значения в JavaScript только при объявлении метода как [out,retval], но таким способом можно вернуть значение всего одной переменной, которая обязаня стоять последним параметром в списке аргументов функции. Оба этих условия мне не подходят. Может кто-нибудь знает почему не срабатывает [out], буду очень признателен.


Если коротко и для направления действий: JavaScript так вызывает методы через IDispatch::Invoke, что у сервера нет шансов переправить обратно параметры, не имеющие атрибута retval. Это ограничение JavaScript или "This behavior is by design".

Здесь в форуме есть информация по этому поводу. Например, поиск по лексеме out, script и т.п.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: И не будет работать
От: U4 Россия  
Дата: 10.06.04 09:09
Оценка:
Спасибо за информацию,

А ты немог бы привести фрагмент кода, как передать массив из JavaScript в COM, чтобs работать с ним как SAFEARRAY вариантов.

Если объявить Method( [in] SAFEARRAY(VARIANT)* arr ),
то при пере даче в него JavaScript-массив выдает ошибку не соответствие типа.

Проходит толко Method( [in] VARIANT* arr). Как перейти от варианта к SAFEARRAY.

Помоги, есле несложно....
Re[3]: И не будет работать
От: ssm Россия  
Дата: 10.06.04 09:17
Оценка:
Здравствуйте, U4, Вы писали:

U4>Спасибо за информацию,


U4>А ты немог бы привести фрагмент кода, как передать массив из JavaScript в COM, чтобs работать с ним как SAFEARRAY вариантов.


U4>Если объявить Method( [in] SAFEARRAY(VARIANT)* arr ),

U4>то при пере даче в него JavaScript-массив выдает ошибку не соответствие типа.

U4>Проходит толко Method( [in] VARIANT* arr). Как перейти от варианта к SAFEARRAY.


U4>Помоги, есле несложно....




if(arr->vt &VT_ARRAY)
{
  SAFEARRAY *pSA = arr->parray;
  ...
}
Re[3]: Массив из JavaScript в COM
От: Vi2 Удмуртия http://www.adem.ru
Дата: 10.06.04 09:26
Оценка:
Здравствуйте, U4, Вы писали:

U4>А ты немог бы привести фрагмент кода, как передать массив из JavaScript в COM, чтобs работать с ним как SAFEARRAY вариантов.


Для этого есть и нормально работает поиск. Например, передавать массивы JScript

Могу дать hint: массивы в JavaScript — это отнюдь не SAFEARRAY-и. Если принять SAFEARRAY-и JavaScript может, то вот отдать... может и можно...
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.