JavaScriptのArray(VARIANT型)をCOM側で作成する方法、map編


static bool CreateJavaScriptMap( IActiveScript* pAS, std::map& src, IDispatch** pout )
{
HRESULT hr;
CComPtr pD;
CComVariant vr;
DISPID idMethod;
LPOLESTR nm[] = { L"Array" };

hr = pAS->GetScriptDispatch(NULL,&pD);
_ASSERT( hr == S_OK );
hr = pD->GetIDsOfNames(IID_NULL, nm, 1, LOCALE_USER_DEFAULT, &idMethod);
_ASSERT( hr == S_OK );

DISPPARAMS pm = {NULL,0,0,0};

hr = pD->Invoke(idMethod,IID_NULL,LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,&pm,&vr,NULL,NULL); // Array作成
_ASSERT( hr == S_OK );

CComPtr px;
hr = vr.pdispVal->QueryInterface( &px );
_ASSERT( hr == S_OK );

CComVariant vtResult;
hr = px->InvokeEx(DISPID_VALUE, LOCALE_USER_DEFAULT, DISPATCH_CONSTRUCT, &pm, &vtResult, NULL, NULL);
_ASSERT( hr == S_OK );

CComPtr px2;
hr = vtResult.pdispVal->QueryInterface( &px2 );
_ASSERT( hr == S_OK );

for( auto& it : src )
{
CComBSTR key(it.first.c_str()); // key

DISPID dispidKey;
hr = px2->GetDispID(key, fdexNameEnsure, &dispidKey);
_ASSERT( hr == S_OK );
CComVariant data = it.second; // value

DISPID namedArgs[] = {DISPID_PROPERTYPUT};
DISPPARAMS prm = {&data, namedArgs, 1, 1};
hr = px2->InvokeEx(dispidKey, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &prm, NULL, NULL, NULL);
_ASSERT( hr == S_OK );
}

*pout = px2;
(*pout)->AddRef();
return true;

}