首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Chakra和IDispatch的索引属性

基于Chakra和IDispatch的索引属性
EN

Stack Overflow用户
提问于 2017-10-19 18:46:11
回答 1查看 235关注 0票数 1

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

代码语言:javascript
复制
[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不支持此属性或方法‘。

我尝试了以下语法变体:

代码语言:javascript
复制
object.Event["foo"] = handler;
object.Event("foo", handler);
object.put_Event("foo", handler);
object.Event("foo") = handler;

最后一个是如何使用vbscript完成这一任务的:

代码语言:javascript
复制
object.Event("foo") = GetRef("handler)

如果我像下面这样在IDL中使用方法语法,那么如果可能的话,我更愿意使用属性赋值。

代码语言:javascript
复制
[id(MYDISPID_GETEVENT)] HRESULT GetEvent(BSTR strEventName, [out, retval] IDispatch ** ppHandler);
[id(MYDISPID_SETEVENT)] HRESULT SetEvent(BSTR strEventName, IDispatch * pHandler);

还请注意,简单的属性赋值确实有效,只有当我尝试索引属性时,它才会中断。我确实了解到,JavaScript在对象支持语法上做了一些非常不同的事情,至少对于原生JavaScript对象是这样。这可能只是chakrart互操作层中的不兼容吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-02 22:57:21

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

让App实现一个propget,该事件返回具有自定义(非双重接口) IDispatch实现的对象。该对象保存到DISPID的名称映射,并且每当通过GetIDsOfNames请求未知名称时,都会返回以前未分配的DISPID。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46836822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档