我正在使用本机窗口API和chakrart JavaScript引擎创建可编写脚本的应用程序。 我喜欢在我的IDL以下接口:基于Chakra和IDispatch的索引属性
[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至少对于本地JavaScript对象来说与对象[prop]语法有很大不同。这可能仅仅是一个不兼容的chakrart互操作层?
所以我没有给你答案,但我即将尝试做类似的事情,并且很好奇你是如何注册你的本地对象的?您是否创建了一个类型为VT_DISPATCH的VARIANT,其中包含对象的IDispatch指针,将它传递给JsVariantToValue,然后将该值作为全局对象的属性注册? –
这正是我所做的。这也意味着我卡住了使用ChakraRT而不是能够使用ChakraCore,ChakraCore是引擎的便携式部分,但IDispatch不是,所以...我也写了一个函数,它需要IDispatch和ITypeInfo指针和寄存器所有可分派的成员作为全局的属性。这是因为JavaScript运行时托管没有像IActiveScript :: AddNamedItem s SCRIPTITEM_GLOBALMEMBERS标志。 抱歉多次删除我的回复,我失明了,编辑框与我的屏幕阅读器表现不佳。 – SoronelHaetir