Re: Passing array of BSTR from JavaScript to VC++
Igor,
Thank you for the hint with IDispatch::Invoke. I would like to add that
ATL's CComPtr<IDispatch>::GetPropertyByName is handy to get the items
from automation object passed from JScript.
The function below will convert array elements to string, concatenate
them and return back to JScript. It's easy to see that JScript also
provides type information, that is
Array5 = new Array();
Array5[0] = 12;
Array5[1] = "34";
Array5 passed to ATL code will have property "length" = {VT_I4, 2},
property "0" = {VT_I4, 12}, property "1" = {VT_BSTR, "34"}.
Roman
===
#define __C(x) { HRESULT __a = (x); if(FAILED(__a)) AtlThrow(__a); }
STDMETHOD(Accept)(VARIANT vValue, VARIANT* pvResult) throw()
{
ATLTRACE(_T("%s({ vt %d, ...}, ...)\n"), __FUNCTION__, vValue.vt);
if(!pvResult)
return E_POINTER;
_ATLTRY
{
USES_CONVERSION;
CComVariant vResult;
switch(vValue.vt)
{
case VT_DISPATCH:
{
CComPtr<IDispatch>& pDispatch =
reinterpret_cast<CComPtr<IDispatch>&>(vValue.pdispVal);
CComVariant vLength;
__C(pDispatch.GetPropertyByName(L"length", &vLength));
__C(vLength.ChangeType(VT_I4));
CStringW sResult;
for(LONG nIndex = 0; nIndex < vLength.lVal; nIndex++)
{
CString sName;
sName.Format(_T("%d"), nIndex);
CComVariant vItem;
__C(pDispatch.GetPropertyByName(T2COLE(sName), &vItem));
ATLTRACE(_T("%s: nIndex %d, vItem { vt %d, ...}\n"), __FUNCTION__,
nIndex, vItem.vt);
__C(vItem.ChangeType(VT_BSTR));
sResult.Append(vItem.bstrVal);
}
}
break;
default:
AtlThrow(E_INVALIDARG);
}
VariantInit(pvResult);
ATLVERIFY(SUCCEEDED(vResult.Detach(pvResult)));
}
_ATLCATCH(Exception)
{
return Exception.m_hr;
}
return S_OK;
}