将对象从Javascript传递到C++; 我找到了解决方案,但我还有一个任务:从Javascript到< C++ >强>对象(如果我使用IDispatch的iWebBuffSer2)< /P> 我的意思是,我需要通过JavaScript对象参数< /p>通过Wield.Exalal.Frand调用C++方法。 var obj = {name: "Petr", group: "Friend"}; window.external.myMethod(obj);
如何访问对象成员“name”、“group”等?如果您只需要能够读取对象字段,最灵活的方法是使用JSON 在网页侧使用: var obj={name:“Petr”,group:“Friend”}; window.external.myMethod(JSON.stringify(obj))将对象从Javascript传递到C++; 我找到了解决方案,但我还有一个任务:从Javascript到< C++ >强>对象(如果我使用IDispatch的iWebBuffSer2)< /P> 我的意思是,我需要通过JavaScript对象参数< /p>通过Wield.Exalal.Frand调用C++方法。 var obj = {name: "Petr", group: "Friend"}; window.external.myMethod(obj);,javascript,c++,iwebbrowser2,Javascript,C++,Iwebbrowser2,如何访问对象成员“name”、“group”等?如果您只需要能够读取对象字段,最灵活的方法是使用JSON 在网页侧使用: var obj={name:“Petr”,group:“Friend”}; window.external.myMethod(JSON.stringify(obj)) 在C++侧定义MyMultMeod()以接受单个字符串参数。然后使用将此参数解析为可读对象。您可以通过接口及其方法和访问对象的属性 根据您对代码< MyMeals的定义,您应该在C++代码中接收 Obj>代码>
<>在C++侧定义MyMultMeod()以接受单个字符串参数。然后使用将此参数解析为可读对象。您可以通过接口及其方法和访问对象的属性
根据您对代码< MyMeals<代码>的定义,您应该在C++代码中接收<代码> Obj>代码>作为代码或>代码> IDISPATTU/<代码>。如果一个
变量
,vt
应该是vt_dispatch
,在这种情况下,您可以安全地解除对pdispval的引用
一旦有了IDispatch
指针,就可以使用GetIDsOfNames
获取感兴趣的属性的
_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
文档
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;
}
和jave代码示例
var frec = {code:'', state:0};
frec.code = row.cells[0].innerHTML;
external.FeatureStateChg (frec);
_featState (row.cells[2], frec.state);
我现在知道并正在做这件事,但我认为这可能与上面文章中的链接相同,但我不是COM中的高级用户:((上面的文章是在ExpertsExchange中。我认为把它们链接起来不是一个好主意,所以…我没有在ExpertsExchange注册。好的,那么,给定的问题呢?既然有人帮了你,那么回顾一下你的问题怎么样?;我已经做了:)在你的笔记之后,马上有一个问题非常好,只有一个问题-我们如何枚举对象的所有成员?我尝试使用pDispatch->GetTypeInfo=>itTypeInfo::GetNames-但有点错误:(一些解释也很感谢。)
{
// ...
VariantInit (&varg);
if ((hr = IDispatch_VarGet (pRDisp, L"code", &varg)))
{
VariantClear (&varg);
return hr;
}
if (V_VT (&varg) == VT_BSTR)
// ...
VariantClear (&varg);
return hr;
}
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;