我想将JavaScript对象(JSON和函数对象)传入我的ActiveX控件。理想情况下,我可以操纵JavaScript对象(例如读取或修改JSON),并从ActiveX控件内部执行JavaScript函数调用(使用C++)。这是否有可能,还是我必须解决通过字符串?是否有可能将JavaScript对象传递给ActiveX(并使用它们)?
例如,以下是我在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);
调用的IDispatch ::为0的DISPID调用似乎对调用工作函数对象。但是,要调用对象的方法,您必须首先获得相应的DISPID,正如Taxilian所说。 GetNextDispID应该为此工作(IDispatchEx的第一个QueryInterface;转换为IDispatchEx似乎也可以,但也许不安全)。
你应该看看这个问题:[从ActiveX传递字节数组到JavaScript,反之亦然](http:// stackoverflow。COM /问题/ 1926723 /通过阵列 - 的字节从 - 的ActiveX到的JavaScript和 - 反之亦然)。只要你'串化'你的对象,并将其作为字符串(obv)传递,你就是金。 –
是的,我看到了这个问题。字符串化不一定是我想要做的唯一事情;这只是一个例子。也就是说,如果事实证明这太复杂,我最终可能会传递字符串。 –