単純にCOMオートメーションサーバーを作成すれば事足ります。コードの再利用という点から考えてみてもそれがいいのですが・・・、一つのプログラム内で完結させたいといった時に調べてみました。
たとえば、自作の複雑なオブジェクトを持つアプリケーションがあって、jscriptなどのスクリプトでプラグインを書いてもらう、というようなケースなどでは、スクリプト環境をホストしなければなりません。
完全に自分用のメモで(^^;、 ネットなどで検索をしたり、MSDNドキュメントを拾い読みなどをまとめた備忘録です。あしからず。
で、やはりCOMのお世話にならないといけません。Visual Studio Express Editionでは全部自分でコーディングしないといけないので、退屈なコードを書かないといけないところが面倒です・・・。
手順としては、
- スクリプトから操作させたいオブジェクトをIDispatch を継承、もしくは、オブジェクトへのラッパークラスをIDispatch実装クラスでインプリメントする。
- スクリプトをホストするため(スクリプトからの様々な通知を受け取るため?)に必要なIActiveScriptSite の 実装クラスを作成
で、これらを使って、以下を順番に実行。
- CoCreateInstance APIでIActiveScriptのインスタンスを生成
- IActiteScript::SetScriptSite()へIActiveScriptSiteの実装クラスのインスタンスをnewして放り込む。
- IActiveScript::QueryInterface()でIActiveScriptParse インターフェイスポインタ(IID_IActiveScriptParse)を得る。
- IActiveScriptParse::InitNew()をコール
- IActiveScript::AddNamedItem()で、自前のC++オブジェクトの名前をつける。スクリプトではこの名前を使ってアクセスさせる。
- IActiveScriptParse::ParseScriptText()でスクリプト文を解析させる
- IActiveScript::SetScriptState(SCRIPTSTATE_CONNECTED)をコール
- IActiveScript::SetScriptState(SCRIPTSTATE_CLOSED)をコール
- インターフェイスポインタの後始末
という流れ。