首页 > 程序开发 > web前端 > JavaScript > 正文
javascript获取COM或ATL返回的数组(整型或字符串数组)VBArray相关
2011-12-24       个评论      
收藏    我要投稿

 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的专栏
点击复制链接 与好友分享!回本站首页
相关TAG标签 数组 字符串
上一篇:JS实现点击下载
下一篇:javascript 使用VBArray (JS调用VBS的例子)
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站