我正在使用本机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互操作层中的不兼容性吗?
答案 0 :(得分:0)
我已经确认了一种使用所需语法执行此操作的方法(App.Event [' foo'] = someHandler;)。如上所述,我已经知道JavaScript将名称[' foo']视为名称上的成员查找
让App对象实现Event的propget,返回具有自定义(非双接口)IDispatch实现的对象。该对象将名称映射保存为DISPID,并且每当通过GetIDsOfNames请求未知名称时,将返回先前未分配的DISPID。
请注意,为了符合IDispatch的规则,即使稍后将空处理程序分配给给定名称,对象也需要跟踪名称,以便始终为特定名称返回相同的DISPID。 / p>