gpt4 book ai didi

javascript - 是否可以将 Javascript 对象传递给 ActiveX(并使用它们)?

转载 作者:太空狗 更新时间:2023-10-29 23:08:53 25 4
gpt4 key购买 nike

我想将 JavaScript 对象(JSON 和函数对象)传递到我的 ActiveX 控件中。理想情况下,我可以操作 JavaScript 对象(例如读取或修改 JSON)并从 ActiveX 控件(使用 C++)中执行 JavaScript 函数调用。这有可能吗,还是我必须满足于传递字符串?

例如,这是我可以在 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)


接口(interface)函数:

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, &params, NULL, NULL, NULL);

使用 DISPID 为 0 调用 IDispatch::Invoke 似乎适用于调用函数对象。但是,要调用一个对象的方法,就得先得到对应的DISPID,就像塔西里安说的那样。 GetNextDispID 应该适用于此(IDispatchEx 的第一个 QueryInterface;转换到 IDispatchEx 似乎也有效,但可能不安全)。

最佳答案

哇,我今天显然不是很聪明,因为我刚刚写了一个答案,完全遗漏了你说 npapi 插件代码是一个例子的部分 =]

因此,要回答正确的问题,是的,您可以。 ActiveX 中与 NPObject 最相关的类型是 IDispatch (或 IDispatchEx )。您无需使用 GetProperty、SetProperty 和 Invoke,只需调用 Invoke 并告诉它是否应该获取属性、设置属性或调用方法。您首先必须查询以获取相关成员的 DISPID;类似于 NPIdentifier,DISPID 是字符串和数字之间的映射。

如果你还没有看过它,你真的应该看看 FireBreath ,它提供了一个抽象,允许您使用相同的代码库编写一个适用于 NPAPI 和 ActiveX 的插件。它有一个 wrapper to allow it to use IDispatch objects作为示例,您可能会发现它很有用。

长话短说,您可以使用 JS 对象,就像使用 NPObject 一样,方法是使用 IDispatch(或者更好的是 IDispatchEx)。大多数来自 javascript 的东西都是作为 IDispatchEx 出现的,但偶尔我会看到需要 IDispatch 故障转移支持的实例。

希望它对您有所帮助,我希望我最初的回答(在我重新阅读您的问题之前)没有让您失望。

关于javascript - 是否可以将 Javascript 对象传递给 ActiveX(并使用它们)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7721335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com