【发布时间】:2011-12-05 00:00:16
【问题描述】:
我想将 JavaScript 对象(JSON 和函数对象)传递到我的 ActiveX 控件中。理想情况下,我可以操作 JavaScript 对象(例如读取或修改 JSON)并从 ActiveX 控件中执行 JavaScript 函数调用(使用 C++)。这有可能吗,还是我必须接受传递字符串?
例如,这是我可以在 Firefox 中执行的操作。请注意,我有一个 JSON 对象的引用,而且我还可以执行 JavaScript 函数调用:
NPString jsonToString(NPP instance, NPObject* json)
{
NPVariant result;
NPVariant arg;
NPIdentifier identifier;
/* Get the global object */
NPObject* windowObj = NULL;
g_NPNFuncs.getvalue(instance, NPNVWindowNPObject, &windowObj);
/* Get JSON object */
identifier = g_NPNFuncs.getstringidentifier("JSON");
g_NPNFuncs.getproperty(instance, windowObj, identifier, &result);
NPObject* jsonObj = NPVARIANT_TO_OBJECT(result);
/* Call stringify */
identifier = g_NPNFuncs.getstringidentifier("stringify");
OBJECT_TO_NPVARIANT(json, arg);
g_NPNFuncs.invoke(instance, jsonObj, identifier, &arg, 1, &result);
return NPVARIANT_TO_STRING(result);
}
编辑 - 这是我想出的解决方案:
IDL 文件:
[id(TEST_ID)] BSTR Test(BSTR data, IDispatch* function);
调度图:
DISP_FUNCTION_ID(CApp, "test", TEST_ID, Test, VT_BSTR, VTS_BSTR VTS_DISPATCH)
接口函数:
BSTR Test(BSTR data, IDispatch* function)
调用 JavaScript 函数对象:
VARIANTARG args[1];
args[0].vt = VT_BSTR;
args[0].bstrVal = _bstr_t(dataStr).GetBSTR();
DISPPARAMS params;
params.cArgs = 1;
params.cNamedArgs = 0;
params.rgvarg = args;
HRESULT hresult = function->Invoke(0, IID_NULL,
LOCALE_USER_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);
使用 DISPID 为 0 调用 IDispatch::Invoke 似乎适用于调用函数对象。但是,要调用一个对象的方法,就得先得到对应的DISPID,正如Taxilian所说。 GetNextDispID 应该可以解决这个问题(IDispatchEx 的第一个 QueryInterface;转换为 IDispatchEx 似乎也可以,但可能不安全)。
【问题讨论】:
-
你应该看看这个问题:Passing array of bytes from ActiveX to javascript and vice versa。只要你“字符串化”你的对象,并将它作为一个字符串(obv)传递,你就是金色的。
-
是的,我看到了这个问题。 Stringify 不一定是我唯一想做的事情;这只是一个例子。也就是说,如果这被证明太复杂,我最终可能只是传递字符串。
标签: javascript c++ mfc activex npapi