ActiveXオブジェクトからJScriptへ文字列の配列を適切に返す方法

Win32 APIで作業していて、ActiveXオブジェクトからJScriptに文字列の配列を返す必要がある場合、いくつかの課題に直面することがあります。この問題は通常、文字列が転送中に「失われている」ように見えるときに発生します。COMオブジェクト、ActiveX、およびJScriptの関係を理解することは、これらの環境でのデータ処理の成功に不可欠です。このブログ投稿では、これを達成するための正しいアプローチを説明します。

問題

COMオブジェクトのためのIDL(インターフェース定義言語)ファイルで文字列の配列を返すメソッドを含むインターフェースを定義しました。具体的には、関数のシグネチャは以下のようになります:

HRESULT GetArrayOfStrings([out, retval] SAFEARRAY(BSTR) * rgBstrStringArray);

関数自体は正しく動作しますが、問題は文字列がJavaScriptの変数に代入されるときに発生し、結果として文字列が失われているように見えます。データが正しく転送されることを確認する必要があります。

解決策

ActiveXオブジェクトからJScriptに文字列の配列を適切に渡すために、次の詳細な手順に従ってください:

ステップ1: SAFEARRAYをVARIANTでラップする

COMオブジェクトとJScript間の通信を容易にするために、返す前にSAFEARRAYVARIANTでラップする必要があります。これにより、配列が適切に処理され、データの損失が発生しないことが保証されます。これを達成するための修正された関数コードは以下の通りです:

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray)
{
   // 配列を保持するためのVARIANTを宣言します。
   _variant_t ret;
   // VARIANTの型を配列の配列に設定します。
   ret.vt = VT_ARRAY | VT_VARIANT;
   ret.parray = rgBstrStringArray; // SAFEARRAYを代入します。
   *pvarBstrStringArray = ret.Detach(); // 返すために分離します。
   return S_OK; // 成功を返します。
}

ステップ2: JScriptでVBArrayを使用する

データがVARIANTでラップされ、ActiveXから正常に返されたら、JScriptコード内でVBArrayオブジェクトを使用してデータを適切に展開できます。使用する必要があるコードの行は次の通りです:

var jsFriendlyStrings = new VBArray(axOb.GetArrayOfStrings()).toArray();

この一行で、返されたVARIANTがJavaScriptに適した文字列の配列に変換され、必要に応じてデータを処理できるようになります。

結論

ActiveXオブジェクトからJScriptへ文字列の配列を転送する処理は、COMオブジェクトとJavaScriptの相互作用を操作する方法を理解することにかかっています。SAFEARRAYVARIANTでラップし、VBArrayを使用してそれを展開することで、すべてのデータがロスなく正しく渡されることを保証できます。

これで、管理スクリプトで文字列の配列を正常に返し、利用するための正しいアプローチを身につける準備が整いました。コーディングを楽しんでください!