COM中获取JavaScript数组大小的代码


Posted in Javascript onNovember 22, 2009

IDispatch类型的指针,则表明该数组对象实际是一个JavaScript的内建数组对象,在JavaScript端,我们可以通过length属性来得到数组的大小,那么在此处,可以通过GetIDsOfNames函数和Invoke函数来获取数组长度,这样可以动态变量数组内容。

// 获取数组长度 
BSTR bstrLength = L"length"; 
DISPID dispid; 
hr = lpDispatch->GetIDsOfNames(IID_NULL, &bstrLength, 1, 
LOCALE_USER_DEFAULT, &dispid); 
if ( SUCCEEDED(hr) ) 
{ 
CComVariant varResult; 
hr = lpDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
DISPATCH_PROPERTYGET, &noArgs, &varResult, NULL, NULL); if ( varResult.vt == VT_I4) 
{ 
nLength = varResult.intVal; 
} 
}

这个时候,nLength获得得到的就是数组的长度。

在JavaScript中的数组时一个对象,数组内容则是该对象的属性,是动态被创建的,这些属性的查询方式与length的查询方式有些类似,也是GetIDsOfNames和Invoke函数,主要差别在于名字的区别,数组中元素对象的属性,其名字是动态创建,也就是可以通过下标方式方式获取,因此,在此处,也可以通过下标方式获取该属性名称,具体如下:

for ( int i=0; i<nLength; ++i) 
{ 
CComVariant vaIndex(i, VT_I4); 
vaIndex.ChangeType(VT_BSTR); 
DISPID dispid; 
hr = lpDispatch->GetIDsOfNames(IID_NULL, &vaIndex.bstrVal,1, 
LOCALE_USER_DEFAULT, &dispid); 
if ( FAILED(hr) ) 
{ 
continue; 
} 
CComVariant varResult; 
hr = lpDispatch->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
DISPATCH_PROPERTYGET, &noArgs, &varResult, NULL, NULL); 
VARTYPE vt = varResult.vt; 
if (vt == VT_DISPATCH ) 
{ 
InvokeArray( varResult ); 
continue; 
} 
hr = varResult.ChangeType(VT_BSTR); 
CComBSTR bstrVal = varResult.bstrVal; 
}

于是通过这两种属性方式的调用,就可以在COM接口中便利所有的JavaScript数组对象了。

这个有什么好处呢,在查看很多网上资源的时候,发现大部分采用SAFEARRAY方式对结构体进行处理,传入到COM接口中,但SAFEARRAY在MIDL中并不被支持,而且JavaScript对象本身也不支持这个内容,要对SAFEARRAY方式操作,需要切换VBScript和JavaScript两种语言,这会导致程序编写的困难和维护人员的困惑。

直接采用JavaScript方式传入数组,对数组任意方式进行整合,就不需要通过SAFEARRAY方式进行结构体整合。同时,由于JavaScript中的每一个对象(元素)都带有本身的类型信息,因此,JavaScript中的数组时C中结构体的最佳替代方式(传递方式)。

Javascript 相关文章推荐
JavaScript 的继承
Oct 01 Javascript
文本框根据输入内容自适应高度的代码
Oct 24 Javascript
jquery通过visible来判断标签是否显示或隐藏
May 08 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
Jun 04 Javascript
Javascript正则控制文本框只能输入整数或浮点数
Sep 02 Javascript
jQuery实现冻结表格行和列
Apr 29 Javascript
jQuery实现定时读取分析xml文件的方法
Jul 16 Javascript
如何使用jquery easyui创建标签组件
Nov 18 Javascript
Vue.js如何实现路由懒加载浅析
Aug 14 Javascript
vue项目开发中setTimeout等定时器的管理问题
Sep 13 Javascript
JS中自定义事件的使用与触发操作实例分析
Nov 01 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 Javascript
面向对象的编程思想在javascript中的运用上部
Nov 20 #Javascript
javascript 设置文本框中焦点的位置
Nov 20 #Javascript
ExtJS Grid使用SimpleStore、多选框的方法
Nov 20 #Javascript
Jquery中增加参数与Json转换代码
Nov 20 #Javascript
ExtJS的FieldSet的column列布局
Nov 20 #Javascript
页面版文本框智能提示JS代码
Nov 20 #Javascript
js url传值中文乱码之解决之道
Nov 20 #Javascript
You might like
DOTA2 无惧惊涛骇浪 昆卡大型水友攻略
2020/04/20 DOTA
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
PHP 文件类型判断代码
2009/03/13 PHP
php自动获取目录下的模板的代码
2010/08/08 PHP
php常用ODBC函数集(详细)
2013/06/24 PHP
php字符串过滤与替换小结
2015/01/26 PHP
php处理带有中文URL的方法
2016/07/11 PHP
Docker配置PHP开发环境教程
2016/12/21 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
javascript实现拖放效果
2015/12/16 Javascript
详解Angular 4 表单快速入门
2017/06/05 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
今天,小程序正式支持 SVG
2019/04/20 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
python算法学习之基数排序实例
2013/12/18 Python
python实现手机通讯录搜索功能
2018/02/22 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
python+os根据文件名自动生成文本
2019/03/21 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
七夕相亲活动策划方案
2014/08/31 职场文书
纪念九一八事变演讲稿:牢记历史,捍卫主权
2014/09/14 职场文书
授权收款委托书范本
2014/10/10 职场文书
舞出我人生观后感
2015/06/16 职场文书
Python面向对象编程之类的概念
2021/11/01 Python