gpt4 book ai didi

javascript - 基于 Chakra 和 IDispatch 的索引属性

转载 作者:行者123 更新时间:2023-11-28 04:04:17 26 4
gpt4 key购买 nike

我正在使用 native Windows API 和 chakrart JavaScript 引擎创建一个可编写脚本的应用程序。我的 IDL 中有如下接口(interface):

[oleautomation, dual, nonextensible,
uuid(...)]
interface IMyInterface : IDispatch
{
[id(MYDISPID_EVENT), propget] HRESULT Event(BSTR strEventName, [out, retval] IDispatch ** ppHandler);
[id(MYDISPID_EVENT), propput] HRESULT Event(BSTR strEventName, IDispatch * pHandler);
};

我已经能够毫无问题地将 native 对象添加到 chakrart 引擎(通过使用 JsVariantToValue,然后在当前上下文的全局对象上设置属性)。但是,当我尝试设置事件处理程序时,我收到异常消息“对象不支持此属性或方法”。

我尝试了以下语法变体:

object.Event["foo"] = handler;
object.Event("foo", handler);
object.put_Event("foo", handler);
object.Event("foo") = handler;

最后一个接近于使用 vbscript 完成此操作的方式:

object.Event("foo") = GetRef("handler)

如果我在 IDL 中使用方法语法,如下所示,它可以工作,如果可能的话,我更愿意使用属性分配。

[id(MYDISPID_GETEVENT)] HRESULT GetEvent(BSTR strEventName, [out, retval] IDispatch ** ppHandler);
[id(MYDISPID_SETEVENT)] HRESULT SetEvent(BSTR strEventName, IDispatch * pHandler);

还要注意,简单的属性分配确实有效,只有当我尝试索引属性时,它才会中断。我确实明白 JavaScript 的做法与 object[prop] 语法非常不同,至少对于 native JavaScript 对象来说是这样。这可能只是 chakrart 互操作层的不兼容?

最佳答案

我已经确认了一种使用所需语法执行此操作的方法(App.Event['foo'] = someHandler;)。如前所述,我已经知道 JavaScript 将 name['foo'] 视为名称的成员查找

让 App 对象实现 Event 的 propget,该属性返回具有自定义(非双接口(interface))IDispatch 实现的对象。该对象保留名称到 DISPID 的映射,并且每当通过 GetIDsOfNames 请求未知名称时,都会返回先前未分配的 DISPID。

请注意,为了遵守 IDispatch 的规则,即使稍后将空处理程序分配给给定名称,对象也需要跟踪名称,以便始终为特定名称返回相同的 DISPID。

关于javascript - 基于 Chakra 和 IDispatch 的索引属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46836822/

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