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>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.