我想將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)傳遞,你就是金。 –
是的,我看到了這個問題。字符串化不一定是我想要做的唯一事情;這只是一個例子。也就是說,如果事實證明這太複雜,我最終可能會傳遞字符串。 –