2008-09-05 24 views
5

我需要調用一個Win32 API來獲取一系列字符串,並且我想將這些字符串的數組返回給JavaScript。這是用於管理腳本的本地機器上運行的腳本,不適用於Web瀏覽器。如何從ActiveX對象返回字符串數組到JScript

的COM對象我的IDL文件中有我打電話到的接口:

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

函數正確返回,但字符串得到「丟失」時,他們被分配到一個變量JavaScript的。

問題是: 將字符串數組返回給JavaScript變量的正確方法是什麼?

回答

6

如果我記錯,你需要換一個VARIANTSAFEARRAY,以便它打通,然後用VBArray object把它解壓到對事物的JS方:

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

應該返回ret.Detach()語句實際上是 > pvarBstrStringArray = ret.Detach(); 謝謝 – Mark 2008-12-13 00:16:42

1

Shog9 是正確的。 COM腳本要求所有輸出都是VARIANTS。

實際上,它也要求所有的INPUTs都是VARIANTS--在你最喜歡的幫助文件中查看IDispatch的令人討厭的細節。它只被認爲是ATL和類似圖層(這很可能是你正在使用的)雙接口實現的魔力,你不必擔心這一點。在調用實際方法之前,調用代碼傳遞的輸入VARIANT會被轉換爲匹配您的方法簽名。