ActiveScript のセットアップ手順の説明は省略していますので,こちらの資料などを参照してください。
- オブジェクト生成には,ScriptHost COM インスタンスが必要です。スクリプトのセットアップ時に以下のような処理を実行しているので,ここで生成した IActiveScript へのポインタ(下記リストでは pAS)を参照できるようにしておきます。
LPOLESTR language = OLESTR("JScript"); CLSID CLSID_Script; ::CLSIDFromProgID(language, &CLSID_Script); CComPtrpAS; pAS.CoCreateInstance(CLSID_Script, 0, CLSCTX_INPROC_SERVER); .......................... - IActiveScript::GetScriptDispatch メソッドを使用してDispatchEx を取得します。ここで参照するオブジェクトが,JScript のルートオブジェクトに相当します。
CComPtr
idisp; pAS->GetScriptDispatch(NULL, &idisp); CComQIPtr jsroot(idisp); - ルートオブジェクトを使用して,生成するオブジェクトの DispID を取得します。下記リストでは,JScript の Array オブジェクトのIDを取得しています。
CComBSTR objectName("Array"); DISPID objectID; jsroot->GetDispID(objectName, 0, &objectID)); - オブジェクトのコンストラクタを呼び出して,インスタンスを生成します。生成したオブジェクトへの参照は,Variant 変数に IDispatch 型で格納されているので,これを IDispatchEx に QueryInterface して JScript に返してやれば,作業完了!!
DISPPARAMS noargs = { NULL, NULL, 0, 0 }; CComVariant var; jsroot->InvokeEx(objectID, LOCALE_USER_DEFAULT, DISPATCH_CONSTRUCT, &noargs, &var, NULL, NULL)); return CComQIPtr(var.pdispVal);
この方法で,JScript組み込みオブジェクト,JScriptで記述したユーザ定義オブジェクトのいずれのインスタンスも生成することができます。
