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間の通信を容易にするために、返す前にSAFEARRAY
をVARIANT
でラップする必要があります。これにより、配列が適切に処理され、データの損失が発生しないことが保証されます。これを達成するための修正された関数コードは以下の通りです:
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の相互作用を操作する方法を理解することにかかっています。SAFEARRAY
をVARIANT
でラップし、VBArray
を使用してそれを展開することで、すべてのデータがロスなく正しく渡されることを保証できます。
これで、管理スクリプトで文字列の配列を正常に返し、利用するための正しいアプローチを身につける準備が整いました。コーディングを楽しんでください!