Здравствуйте 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>