将对象从 Javascript 传递到 C++
Passing an object from Javascript to C++
我发现将数组从Javascript传递到C++解决方案,但我还有另一个任务:将对象从Javascript传递到C++(如果我将IWebBrowser2与IDispatch一起使用)
我的意思是我需要通过 window.external.method 使用 JavaScript 对象参数调用C++方法
var obj = {name: "Petr", group: "Friend"};
window.external.myMethod(obj);
如何访问对象成员"名称","组"等?
您可以通过 IDispatch
接口及其方法 GetIDsOfNames
和 Invoke
访问对象的属性。
根据您对myMethod
的定义,您应该在C++代码中以VARIANT
或IDispatch *
的形式接收obj
。如果是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
文档。
如果您只需要能够读取对象字段,最灵活的方法是使用 JSON。
在您的网页端使用:
var obj = {name: "Petr", group: "Friend"};window.external.myMethod(JSON.stringify(obj));
在C++端定义 myMethod() 以接受单个字符串参数。然后使用 C++ JSON 解析器将此参数解析为可读对象。
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;
}
和贾夫代码示例...
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;
相关文章:
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 嘿,我正在尝试将此c ++转换为javascript,但有些东西不起作用
- C++中的 JavaScript 样式闭包
- OpenCV(C++)处理来自JavaScript / Web Assembly的图像数据
- 在C++中嵌入 Mozilla 的 JavaScript 引擎
- Javascript 找不到使用 emscripten 编译的导出 WASM 函数
- 在Javascript和C++中计算MD5哈希的不同结果
- 将Wiimote MAC地址转换为PIN码,从C++转换为Python或Javascript
- 如何使用EM_JS从带有参数的C++调用javascript方法
- JavaScript 中的一等函数和 C++ 中的函数声明
- 在 v8 JavaScript 中重复调用C++是否有巨大的开销?
- 在QtWebEngine中捕获JavaScript事件
- JavaScript箭头函数:我们能否像C ++ lambdas一样捕获值
- 我可以使用谷歌 v8 在回调函数中获取 JavaScript 函数C++源文本吗?
- 如何像在javascript中一样"push" c ++映射
- 如何读取 Javascript 文件
- 如何在 C++ 中从 V8 调用 Javascript 函数
- 在 c++ 中是否有像 javascript 中那样"includes()"的方法
- 有没有一种方法可以将数据从javascript发送到exe文件