我正在使用本机 Windows API 和 chakrart JavaScript 引擎创建一个可编写脚本的应用程序。我的 IDL 中有如下接口:
[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);
};
我已经能够毫无问题地将本机对象添加到 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] 语法上做了一些非常不同的事情,至少对于原生 JavaScript 对象。这可能只是 chakrart 互操作层中的不兼容吗?