[out] не возвращается значение
От: DmitryM Россия  
Дата: 06.08.02 03:38
Оценка:
HRESULT m2([in] BSTR sIn,[out] BSTR* sOut,[out] short* iOut, [out,retval] BSTR* sRet);
...
STDMETHODIMP Ctest2::m2(BSTR sIn, BSTR *sOut, short *iOut, BSTR *sRet){
    *sRet = L"sRet";
    *sOut = L"sOut";
    *iOut = 10;
HTML
<OBJECT ID....></OBJECT>
<script language="javascript">
function Bn()
{    var i=3;
    var s="dddd";
    txt2.value = test2.m2(txt1.value, s, i);
    txt3.value = s;
    txt4.value = i;
}
</script>

<input type=button value="Test" onclick="Bn();">
<input type=text name=txt1 size=15>
<input type=text name=txt2 size=15>
<input type=text name=txt3 size=15>
<input type=text name=txt4 size=15>

Почему не возвращаются значения [out] sOut и iOut ?
если [out,retval], то все нормально.
Re: [out] не возвращается значение
От: George_Seryakov Россия  
Дата: 06.08.02 03:54
Оценка:
Здравствуйте DmitryM, Вы писали:

DM>
DM>HRESULT m2([in] BSTR sIn,[out] BSTR* sOut,[out] short* iOut, [out,retval] BSTR* sRet);
DM>...
DM>STDMETHODIMP Ctest2::m2(BSTR sIn, BSTR *sOut, short *iOut, BSTR *sRet){
DM>    *sRet = L"sRet";
DM>    *sOut = L"sOut";
DM>    *iOut = 10;
DM>



DM><script language="javascript">
DM>function Bn()
DM>{    var i=3;
DM>    var s="dddd";
DM>    txt2.value = test2.m2(txt1.value, s, i);
...
DM></script>


DM>Почему не возвращаются значения [out] sOut и iOut ?


Возвращаемый BSTR должен быть размещен SysAllocString или аналогичной функцией, а короткое целое — несовместимо со скриптом, где все — вариант. long, может, и вернет правильно. VARIANT — точно.

DM>если [out,retval], то все нормально.


Это случайно.
GS
Re: [out] не возвращается значение
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.08.02 03:57
Оценка: 4 (1)
Здравствуйте DmitryM, Вы писали:

DM>HRESULT m2([in] BSTR sIn,[out] BSTR* sOut,[out] short* iOut, [out,retval] BSTR* sRet);
DM>...
DM>STDMETHODIMP Ctest2::m2(BSTR sIn, BSTR *sOut, short *iOut, BSTR *sRet){
DM>    *sRet = L"sRet";
DM>    *sOut = L"sOut";
DM>    *iOut = 10;

DM>Почему не возвращаются значения [out] sOut и iOut ? если [out,retval], то все нормально.

Добавление L не решает ничего.
Нужно передавать BSTR строки, а не OLECHAR* и не WCHAR*.
Используй CComBSTR класс ATL, или API функции семейства SysAllocString и иже с ней и SysFreeString. Т.е.
STDMETHODIMP Ctest2::m2(BSTR sIn, BSTR *sOut, short *iOut, BSTR *sRet)
{
    *sRet = CComBSTR( "sRet" ).Detach();
    *sOut = CComBSTR( "sOut" ).Detach();
    *iOut = 10;
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: [out] не возвращается значение
От: DmitryM Россия  
Дата: 06.08.02 06:02
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Возвращаемый BSTR должен быть размещен SysAllocString или аналогичной функцией, а короткое целое — несовместимо со скриптом, где все — вариант. long, может, и вернет правильно. VARIANT — точно.


В JScript оказалось, что число простой тип и передается по значению,
а сложные типы — массивы, строки — по ссылке в VARIANT*

Пришлось вместо числа использовать массив и все заработало !!!!
HRESULT m3([in] VARIANT sIn, VARIANT* iOut,  [out,retval] BSTR* sRet);
...
STDMETHODIMP Ctest2::m3(VARIANT sIn, VARIANT *iOut, BSTR *sRet){
    if(sIn.vt != VT_BSTR) return E_INVALIDARG;
    UINT len = ::SysStringLen(sIn.bstrVal);
    if(iOut->vt == VT_DISPATCH){
            *sRet = CComBSTR( "iOut - VT_DISPATCH" ).Detach();
        IDispatchEx* pDE;
        HRESULT hr = iOut->pdispVal->QueryInterface(IID_IDispatchEx, (void**)&pDE);
        if(FAILED(hr)) return hr;
        // Получить первый элемент, если нет - создать
        DISPID dispid;
        hr = pDE->GetDispID(CComBSTR(L"0"), fdexNameEnsure, &dispid);
        if(FAILED(hr)) {
            pDE->Release(); return hr;
        }
        // Присвоить значение
        VARIANTARG arg;
        arg.vt = VT_I4;
        arg.lVal = len;
        DISPPARAMS dsp;
        dsp.rgvarg= &arg;
        dsp.cArgs=1;
        dsp.cNamedArgs=1;
        DISPID dput=DISPID_PROPERTYPUT;
        dsp.rgdispidNamedArgs=&dput;
        hr= pDE->InvokeEx(dispid, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &dsp, NULL, NULL, NULL);
        pDE->Release();
        if(FAILED(hr)) return hr;
    }
    return S_OK;
}

HTML
function Bn()
{
  var i = new Array(1);
  txt2.value = test2.m3(txt1.value, i);
  txt4.value = i[0];
}

</script>
<input type=button value="Test" onclick="Bn();">
<input type=text name=txt1 size=100>
<input type=text name=txt2 size=100>
<input type=text name=txt4 size=100>
Re[3]: [out] не возвращается значение
От: George_Seryakov Россия  
Дата: 06.08.02 15:37
Оценка:
Здравствуйте DmitryM, Вы писали:

DM>В JScript оказалось, что число простой тип и передается по значению,

DM>а сложные типы — массивы, строки — по ссылке в VARIANT*

DM>Пришлось вместо числа использовать массив и все заработало !!!!

DM>

DM>STDMETHODIMP Ctest2::m3(VARIANT sIn, VARIANT *iOut, BSTR *sRet){

DM>    if(iOut->vt == VT_DISPATCH){
DM>            *sRet = CComBSTR( "iOut - VT_DISPATCH" ).Detach();
DM>        IDispatchEx* pDE;
DM>        HRESULT hr = iOut->pdispVal->QueryInterface(IID_IDispatchEx, (void**)&pDE);
...
DM>}
DM>


Жуть какая. А что, VARIANT типа VT_I4 | VT_BYREF не работает?
GS
Re[4]: [out] не возвращается значение
От: DmitryM Россия  
Дата: 07.08.02 02:51
Оценка: 7 (1)
Здравствуйте George_Seryakov, Вы писали:

GS>Жуть какая. А что, VARIANT типа VT_I4 | VT_BYREF не работает?


Работает если на клиенте используется VBScript — все параметры передаются по ссылке,
а в JScript числа передаются только по значению — читать могу, изменить нет.

Так как на клиенте необходим только JScript, то получается эта жуть.

В VBScript значение i меняется на 44, а в JScript остается равно 1
switch(iOut->vt){
    case VT_I2:    iOut->lVal = 44;    break;    // вызов из VBScript
    case VT_I4:    iOut->lVal = 44;    break;    // вызов из JScript

HTML

<script language="VBScript">
Function Bn_B()
    Dim i
    i = 1
    txt2.value = test2.m2(i)
    txt3.value = i
end function
</script>
<script language="JScript">
function Bn_J()
{
        var i = 1;
    txt2.value = test2.m2(i);
    txt3.value = i;
}
</script>
<input type=button value="VBScript" onclick="Bn_B()">
<input type=button value="JScript" onclick="Bn_J()">
<input type=text name=txt2 size=100>
<input type=text name=txt3 size=100>
Re[5]: [out] не возвращается значение
От: George_Seryakov Россия  
Дата: 07.08.02 04:23
Оценка:
Здравствуйте DmitryM, Вы писали:

GS>>Жуть какая. А что, VARIANT типа VT_I4 | VT_BYREF не работает?


DM>Работает если на клиенте используется VBScript — все параметры передаются по ссылке,

DM>а в JScript числа передаются только по значению — читать могу, изменить нет.

Подумав (и проверив на кошках), это следует признать логичным — в жабе указателей нет, и ByRef, как форма указателя, должен не работать. Почему ж тогда этот трюк с доступом через массив по диспатчу работает? Бейсик прет из всех дыр Джавы?
GS
Re[6]: [out] не возвращается значение
От: Аноним  
Дата: 07.08.02 05:52
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Подумав (и проверив на кошках), это следует признать логичным — в жабе указателей нет, и ByRef, как форма указателя, должен не работать. Почему ж тогда этот трюк с доступом через массив по диспатчу работает? Бейсик прет из всех дыр Джавы?


Массив, он же обьект, в JScript хранится в структуре VARIANT как тип VT_DISPATCH
индекс массива это свойство обьекта, поэтому к элементу с индексом 0 можно обратиться
как к свойству с именем "0"

IDispatchEX->GetDispID(CComBSTR(L"0"), для получения идентификатора по имени — если свойства нет,
то метод создает его
Re[3]: [out] не возвращается значение
От: Vi2 Удмуртия http://www.adem.ru
Дата: 07.08.02 06:24
Оценка:
Здравствуйте DmitryM, Вы писали:

DM>В JScript оказалось, что число простой тип и передается по значению,

DM>а сложные типы — массивы, строки — по ссылке в VARIANT*

DM>Пришлось вместо числа использовать массив и все заработало !!!!


DM>HRESULT m3([in] VARIANT sIn, VARIANT* iOut, [out,retval] BSTR* sRet);


Вот по последнему поподробней — как описАн параметр iOut и почему [in,out]? Просто [out] не проходит в JScript?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: [out] не возвращается значение
От: DmitryM Россия  
Дата: 07.08.02 06:52
Оценка:
Здравствуйте Vi2, Вы писали:

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



DM>>HRESULT m3([in] VARIANT sIn, VARIANT* iOut, [out,retval] BSTR* sRet);


Vi2>Вот по последнему поподробней — как описАн параметр iOut и почему [in,out]? Просто [out] не проходит в JScript?


HRESULT m3([in] VARIANT sIn, [out] VARIANT* iOut[/b], [out,retval] BSTR* sRet);

пропустил здесь пока писАл сообщение
Re[5]: [out] не возвращается значение
От: Аноним  
Дата: 07.08.02 07:01
Оценка:
Здравствуйте DmitryM, Вы писали:

DM>HRESULT m3([in] VARIANT sIn, [out] VARIANT* iOut, [out,retval] BSTR* sRet);


DM>пропустил здесь пока писАл сообщение


Ну раз такое дело — почему же ты анализируешь iOut->vt в операторе if(iOut->vt == VT_DISPATCH)? Потому что твой объект — в DLL? И всё?

По большому счёту, [out] параметры в сервере не должны анализироваться, потому как им могут прислать неопределённую инофрмацию. Правда, гарантируется, что память под VARIANT будет, т.е. указатель правильный. А дальше задача сервера — наполнить VARIANT информацией и отнюдь не читать его.

У тебя маршаллинга нет (это счастье твоё!), поэтому идут адреса напрямую, но это не повод для подобных манипуляций!
Re[6]: [out] параметр
От: Vi2 Удмуртия http://www.adem.ru
Дата: 07.08.02 07:18
Оценка: 10 (1)
Здравствуйте Аноним, Вы писали:

Это я был.

А>По большому счёту, [out] параметры в сервере не должны анализироваться, потому как им могут прислать неопределённую инофрмацию. Правда, гарантируется, что память под VARIANT будет, т.е. указатель правильный. А дальше задача сервера — наполнить VARIANT информацией и отнюдь не читать его.


Хорошо. Вот есть функция — описание в idl: HRESULT m3([out] long* iOut);
Клиент:
long i = 5;
p->m3( &i );
// Какое здесь i после возврата? В in-proc без маршаллинга - 5, при маршаллинге - 55

Сервер:
HRESULT Cx::m3([out] long* iOut)
{
  if( *iOut != 5 )
    *iOut = 55;
  return S_OK;
}
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[7]: [out] не возвращается значение
От: George_Seryakov Россия  
Дата: 07.08.02 13:54
Оценка:
Здравствуйте Аноним, Вы писали:

GS>>Подумав (и проверив на кошках), это следует признать логичным — в жабе указателей нет, и ByRef, как форма указателя, должен не работать. Почему ж тогда этот трюк с доступом через массив по диспатчу работает? Бейсик прет из всех дыр Джавы?


А>Массив, он же обьект,

...

Это понятно, что объект. А почему он по ссылке передается? Не должен ли по значению? Кто-нибудь джаву знает?
GS
Re[8]: [out] не возвращается значение
От: Vi2 Удмуртия http://www.adem.ru
Дата: 07.08.02 14:06
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Это понятно, что объект. А почему он по ссылке передается? Не должен ли по значению? Кто-нибудь джаву знает?


Почему по ссылке? Да потому что такой метод в сервере!

И если Джава, как ты говоришь, не поддерживает передачу по ссылке, то максимум, что она может сделать, — выдать сообщение об ошибке о невозможности передачи указателя. Однако она передаёт VARIANT* для принятия параметра.

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

Но я тоже с Джавой не сталкивался — надо посмотреть дома.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[8]: [out] не возвращается значение
От: Мокроусов Дмитрий Россия  
Дата: 07.08.02 23:57
Оценка: 9 (1)
Здравствуйте George_Seryakov, Вы писали:


А>>Массив, он же обьект,

GS>Это понятно, что объект. А почему он по ссылке передается? Не должен ли по значению? Кто-нибудь джаву знает?

Does JScript support [out] parameters (call-by-reference)?
The official answer from Microsoft is that no, JScript does not support call-by-reference for simple data types, or [out] parameters for ActiveX components.
One way around this limitation is to pass your parameters as properties of an object (or elements of an array, which is the same thing in JScript), as objects are passed by reference and any properties changed in a function will be visible to the caller.

Поэтому чтобы изменить переменную делаем ее как свойство обьекта, а далее диспатчем.
Re[7]: [out] параметр
От: Алекс Россия http://wise-orm.com
Дата: 08.08.02 08:49
Оценка:
Здравствуйте Vi2, Вы писали:

хъ

Vi2>Хорошо. Вот есть функция — описание в idl: HRESULT m3([out] long* iOut);

Vi2>Клиент:
Vi2>
Vi2>long i = 5;
p->>m3( &i );
Vi2>// Какое здесь i после возврата? В in-proc без маршаллинга - 5, при маршаллинге - 55
Vi2>

Vi2>Сервер:
Vi2>
Vi2>HRESULT Cx::m3([out] long* iOut)
Vi2>{
Vi2>  if( *iOut != 5 )
Vi2>    *iOut = 55;
Vi2>  return S_OK;
Vi2>}
Vi2>


ИМХО, с out-proc это не прокатит
Re[9]: [out] не возвращается значение
От: George_Seryakov Россия  
Дата: 08.08.02 15:55
Оценка:
Здравствуйте Мокроусов Дмитрий, Вы писали:

А>>>Массив, он же обьект,

GS>>Это понятно, что объект. А почему он по ссылке передается? Не должен ли по значению? Кто-нибудь джаву знает?

МД>Does JScript support [out] parameters (call-by-reference)?

МД>The official answer from Microsoft is that no, JScript does not support call-by-reference for simple data types, or [out] parameters for ActiveX components.
МД>One way around this limitation is to pass your parameters as properties of an object (or elements of an array, which is the same thing in JScript), as objects are passed by reference and any properties changed in a function will be visible to the caller.

Это не официальный микрософт. Похоже, у микрософтовской джавы действительно лезет бейсик из всех дыр (по краней мере из этой).

МД>Поэтому чтобы изменить переменную делаем ее как свойство обьекта, а далее диспатчем.


Да, очень забавно. Похоже, что переданный объект поддерживает свойство _NewEnum, поскольку в васике его можно проитерировать через for each, но впрямую к айтемам обратиться в васике не получается. Как поизящнее сделать запрос к свойству "0", располагая только диспатчем? Может, есть какой специальный интерфейс, который поддерживается жавовскими массивами?
GS
Re: [out] не возвращается значение
От: Lexey Россия  
Дата: 08.08.02 20:02
Оценка:
Здравствуйте DmitryM, Вы писали:

DM>Почему не возвращаются значения [out] sOut и iOut ?

DM>если [out,retval], то все нормально.

Ах сколько раз твердили миру... Что скриптовые языки понимают out-параметры только в виде VARIANT (к out,retval это не относится — для него можно ставить и простые типы).
"Будь достоин победы" (c) 8th Wizard's rule.
Re[10]: [out] не возвращается значение
От: Vi2 Удмуртия http://www.adem.ru
Дата: 09.08.02 04:33
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS> Да, очень забавно. Похоже, что переданный объект поддерживает свойство _NewEnum, поскольку в васике его можно проитерировать через for each, но впрямую к айтемам обратиться в васике не получается.


А что забавного? Просто массивы, наверное, простая надстройка над Safe Array-ями — всё-таки у нас нет точной информации о внутренней реализации, но по внешнему поведению массив в VB — "обычная" коллекция со свойством по умолчанию и нумератором:
  Dim a(10) As Long, v
  v = a(1) ' свойство по умолчанию
  For Each v In a ' нумератор
    Debug.Print VarType(v), v
  Next v


GS>Как поизящнее сделать запрос к свойству "0", располагая только диспатчем?


свойство "0" — имеется в виду свойство по умолчанию? Тогда это DISPID_VALUE или 0.

GS>Может, есть какой специальный интерфейс, который поддерживается жавовскими массивами?


Скорее всего IEnumVARIANT.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[8]: Что не прокатит?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 09.08.02 04:35
Оценка:
Здравствуйте Алекс, Вы писали:

А>ИМХО, с out-proc это не прокатит


Что не прокатит?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.