我正在使用本機窗口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