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;
相关新闻>>
- Javascript 兼容 IE6、IE7、FF 的“加入收藏”“设为首页”
- JS获取农历日期
- js 中时间相减
- 好好学一遍JavaScript 笔记(一)——基础中的基础
- 好好学一遍JavaScript 笔记(二)——encode、数组、对象创建
- 好好学一遍JavaScript 笔记(三)——StringBuffer、prototype
- 好好学一遍javaScript 笔记(四)——Attribute、HTML元素、文档碎
- 好好学一遍JavaScript 笔记(五)——正则表达式基础
- 好好学一遍JavaScript 笔记(六)——正则表达式基础二
- 好好学一遍JavaScript 笔记(七)——RegExp对象与常用正则
- 发表评论
-
- 最新评论 更多>>