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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值