2008-09-05 20 views
5

一連の文字列を取得するにはWin32 APIを呼び出す必要があります。これらの文字列の配列をJavaScriptに戻したいとします。これは、Webブラウザではなく、管理スクリプト用のローカルマシン上で実行されるスクリプト用です。 COMオブジェクトのActiveXオブジェクトからJScriptに文字列の配列を返す方法

マイIDLファイルには、私がように呼び出していますインターフェースました:

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

機能が正常に返しますが、彼らが変数に代入されているときに、文字列は「失われた」なっていますJavaScript。

質問は JavaScript変数に返される文字列の配列を取得する適切な方法は何ですか?

答えて

6

私が正しくリコール場合、あなたはそれを介して取得し、その後、物事のJS側でそれを解凍するVBArray objectを使用するためにVARIANTSAFEARRAYをラップする必要があります:

HRESULT GetArrayOfStrings(/*[out, retval]*/ VARIANT* pvarBstrStringArray) 
{ 
    // ... 

    _variant_t ret; 
    ret.vt = VT_ARRAY|VT_VARIANT; 
    ret.parray = rgBstrStringArray; 
    *pvarBstrStringArray = ret.Detach(); 
    return S_OK; 
} 

その後、

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

return retDetach()文は実際には であるべきですか?pvarBstrStringArray = ret.Detach(); ありがとう – Mark

1

Shog9 正しいです。 COMスクリプティングでは、すべての出力がVARIANTSである必要があります。

実際には、すべてINPUTsも同様に変更する必要があります。よくあるヘルプファイルのIDispatchの詳細を参照してください。それは、ATLやそれに類するレイヤー(あなたが使っている可能性が最も高いレイヤー)によるデュアルインターフェイス実装の魔法だと思っています。それは心配する必要はありません。実際のメソッドが呼び出される前に、呼び出しコードによって渡された入力VARIANTがメソッドのシグネチャに一致するように変換されます。

関連する問題