javascript獲取COM或ATL返回的數組(整型或字符串數組)VBArray相關

    javascript獲取COM或ATL返回的數組(整型或字符串數組)
    最近筆者工作中碰到一個問題就是在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解析等等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章