JScriptオブジェクトをC++コードで生成する

JScript の任意のオブジェクトを C++(ATL)で生成する手順です。
ActiveScript のセットアップ手順の説明は省略していますので,こちらの資料などを参照してください。
  1. オブジェクト生成には,ScriptHost COM インスタンスが必要です。スクリプトのセットアップ時に以下のような処理を実行しているので,ここで生成した IActiveScript へのポインタ(下記リストでは pAS)を参照できるようにしておきます。
       LPOLESTR language = OLESTR("JScript");
       CLSID CLSID_Script;
       ::CLSIDFromProgID(language, &CLSID_Script);
    
       CComPtr pAS;
       pAS.CoCreateInstance(CLSID_Script, 0, CLSCTX_INPROC_SERVER);
       ..........................

  2. IActiveScript::GetScriptDispatch メソッドを使用してDispatchEx を取得します。ここで参照するオブジェクトが,JScript のルートオブジェクトに相当します。
       CComPtr idisp;
       pAS->GetScriptDispatch(NULL, &idisp);
       CComQIPtr jsroot(idisp);
  3. ルートオブジェクトを使用して,生成するオブジェクトの DispID を取得します。下記リストでは,JScript の Array オブジェクトのIDを取得しています。
       CComBSTR objectName("Array");
       DISPID objectID;
       jsroot->GetDispID(objectName, 0, &objectID));

  4. オブジェクトのコンストラクタを呼び出して,インスタンスを生成します。生成したオブジェクトへの参照は,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で記述したユーザ定義オブジェクトのいずれのインスタンスも生成することができます。


この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
rank← ランキングはこちらをクリック!

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。