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

來源:互聯網
上載者:User

 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解析等等


摘自 xt_chaoji的專欄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.