ネイティブ 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 相互運用レイヤーの非互換性によるものでしょうか?