我找到了Passing an array from Javascript to C++解决方案,但我还有另一项任务:将一个对象从Javascript传递到C ++(如果我将IWebBrowser2与IDispatch一起使用)
我的意思是我需要通过带有JavaScript对象参数的window.external.method调用C ++方法
var obj = {name: "Petr", group: "Friend"};
window.external.myMethod(obj);
如何访问对象成员“name”,“group”等?
答案 0 :(得分:2)
您可以通过IDispatch
界面及其方法GetIDsOfNames
和Invoke
访问对象的属性。
根据您对myMethod
的定义,您应该在C ++代码中以VARIANT
或obj
的身份收到IDispatch *
。如果VARIANT
,vt
应为VT_DISPACTH
,则可以安全取消引用pdispval
。
获得IDispatch
指针后,您可以使用GetIDsOfNames
获取您感兴趣的媒体资源DISPID
,如下所示:
_bstr_t sPropertyName = L"myProperty";
DISPID dispid = 0;
HRESULT hr = pDispatch->GetIDsOfNames(IID_NULL, &sPropertyName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(SUCCEEDED(hr))
{
...
成功收到DISPID
后,您必须根据您是想获取值,设置值还是调用方法,以不同方式致电Invoke
。
例如,要获得一个值:
VARIANT vValue;
hr = pDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, 0, &vValue, 0, 0);
if(SUCCEEDED(hr))
{
...
有关调用时不同排列的详细信息,请参阅Invoke
的文档。
答案 1 :(得分:0)
如果您只需要能够阅读对象字段,最灵活的方法是使用JSON。
在您的网页侧使用:
var obj = {name:“Petr”,group:“Friend”}; window.external.myMethod(JSON.stringify(OBJ));
在C ++端定义myMethod()以接受单个字符串参数。然后使用C++ JSON parser将此参数解析为可读对象。
答案 2 :(得分:-1)
static HRESULT \
IDispatch_VarGet (IDispatch *pRDisp, LPOLESTR Name, VARIANT *pVarRes)
{
DISPPARAMS DispParams;
DISPID dispid;
HRESULT hr;
if ((hr = IDispatch_GetIDsOfNames (pRDisp, &IID_NULL,
&Name, 1, LOCALE_SYSTEM_DEFAULT, &dispid)))
return hr;
ZeroMemory (&DispParams, sizeof (DispParams));
hr = IDispatch_Invoke (pRDisp, dispid, &IID_NULL,
LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET,
&DispParams, pVarRes, NULL, NULL);
return hr;
}
static HRESULT \
IDispatch_VarPut (IDispatch *pRDisp, LPOLESTR Name, VARIANT *pVarArg)
{
DISPPARAMS DispParams;
DISPID dispid, ndispid;
HRESULT hr;
if ((hr = IDispatch_GetIDsOfNames (pRDisp, &IID_NULL,
&Name, 1, LOCALE_SYSTEM_DEFAULT, &dispid)))
return hr;
ndispid = DISPID_PROPERTYPUT;
DispParams.rgvarg = pVarArg;
DispParams.rgdispidNamedArgs = &ndispid;
DispParams.cArgs = 1;
DispParams.cNamedArgs = 1;
hr = IDispatch_Invoke (pRDisp, dispid, &IID_NULL,
LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT,
&DispParams, NULL, NULL, NULL);
return hr;
}
static HRESULT \
IDispatch_StrPut (IDispatch *pRDisp, LPOLESTR Name, LPOLESTR StrVal)
{
VARIANT varg;
HRESULT hr;
VariantInit (&varg);
V_VT (&varg) = VT_BSTR;
V_BSTR (&varg) = SysAllocString (StrVal);
hr = IDispatch_VarPut (pRDisp, Name, &varg);
VariantClear (&varg);
return hr;
}
static HRESULT \
IDispatch_IntPut (IDispatch *pRDisp, LPOLESTR Name, int IntVal)
{
VARIANT varg;
HRESULT hr;
VariantInit (&varg);
V_VT (&varg) = VT_I4;
V_I4 (&varg) = IntVal;
hr = IDispatch_VarPut (pRDisp, Name, &varg);
VariantClear (&varg);
return hr;
}
...
if ((hr = IDispatch_StrPut (pRDisp, L"code", buff)))
return hr;
if ((hr = IDispatch_IntPut (pRDisp, L"state", state)))
return hr;
...
{
// ...
VariantInit (&varg);
if ((hr = IDispatch_VarGet (pRDisp, L"code", &varg)))
{
VariantClear (&varg);
return hr;
}
if (V_VT (&varg) == VT_BSTR)
// ...
VariantClear (&varg);
return hr;
}
和java代码示例......
var frec = {code:'', state:0};
frec.code = row.cells[0].innerHTML;
external.FeatureStateChg (frec);
_featState (row.cells[2], frec.state);
...
var frec = {code:'', name:'', state:0};
if (!external.FeaturesEnum (frec, i))
break;