最近筆者工作中碰到一個問題就是在ATL返回的字符串數組,在js腳本中怎麼都獲取不到,於是去網上看看有沒有解決方案,但是總體感覺很亂,當然也看到一個重要的信息,
感謝那位作者,當時發現一篇05的帖子也是該問題,沒人解答,正好筆者有幸搞定,現拋磚引玉下,希望牛人提出意見
首先,舉例返回字符串數組的情況:
ATL中實現如下:
idl定義:[id(368), helpstring("method TestStringArr")] HRESULT TestStringArr([out,retval]VARIANT *pCode);
.h定義:STDMETHOD(TestStringArr)(VARIANT *pCode);
.cpp實現:
STDMETHODIMP CNsoControl::TestStringArr(VARIANT *pCode)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].cElements =3;
rgsabound[0].lLbound = 0;
psa = SafeArrayCreate(VT_VARIANT,1,rgsabound);//我這裏原來沒用VT_VARIANT,而是用了VT_BSTR類型,結果會導致JS代碼中new VBArray出錯,請一定注意
long idx;
VARIANT setdt;
setdt.vt = VT_BSTR;
//賦值
idx = 0;
setdt.bstrVal = L"a";
SafeArrayPutElement(psa,&idx,&setdt);
idx = 1;
setdt.bstrVal = L"b";
SafeArrayPutElement(psa,&idx,&setdt);
//賦值
idx = 2;
setdt.bstrVal = L"c";
SafeArrayPutElement(psa,&idx,&setdt);
(*pCode).vt = VT_ARRAY|VT_VARIANT;//我這裏原來沒用VT_VARIANT,而是用了VT_BSTR類型,結果會導致JS代碼中new VBArray出錯,請一定注意
(*pCode).parray = psa;
return S_OK;
}
同理對於返回整型數組的情況如下:
STDMETHODIMP CNsoControl::TestStringArr(VARIANT *pCode)
{
SAFEARRAY FAR* psa;
//數組維數
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 2;
psa=SafeArrayCreate(VT_VARIANT,1,rgsabound);//我這裏原來沒用VT_VARIANT,而是用了VT_I4類型,結果會導致JS代碼中new VBArray出錯,請一定注意
long idx;
VARIANT setdt;
setdt.vt = VT_I4;
//賦值
idx = 0;
setdt.lVal = 1;
SafeArrayPutElement(psa,&idx,&setdt);
idx = 1;
setdt.lVal = 2;
SafeArrayPutElement(psa,&idx,&setdt);
//返回安全數組
V_VT(pVal) = VT_ARRAY | VT_VARIANT;//我這裏原來沒用VT_VARIANT,而是用了VT_I4類型,結果會導致JS代碼中new VBArray出錯,請一定注意
V_ARRAY(pVal) = psa;
return S_OK;
}
JS代碼:
<SCRIPT LANGUAGE="JScript">
<!--
function MyCall(){
var obj = new VBArray(MyActiveX.TestStringArr());
var retVal = obj.toArray(); //用VBArray將安全數組轉爲JS數組
alert(retVallength);
//document.write(retVal + "<br />")
document.write(retVal.slice(1) + "<br />")
//document.write(retVal)
}
-->
</SCRIPT>
後續有時間可以看看怎麼返回自定義結構數組
其實也可以返回字符串讓js去解析,不過這樣速度比較慢,獲取封裝成xml串返回js解析等等