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 相关文章推荐
游戏人文件夹程序 ver 3.0
Jul 14 Javascript
jQuery 性能优化指南(3)
May 21 Javascript
Aptana调试javascript图解教程
Nov 30 Javascript
JavaScript具有类似Lambda表达式编程能力的代码(改进版)
Sep 14 Javascript
jQuery阻止冒泡和HTML默认操作
Nov 17 Javascript
Knockoutjs的环境搭建教程
Nov 26 Javascript
js图片延迟加载的实现方法及思路
Jul 22 Javascript
Js 获取当前函数参数对象的实现代码
Jun 20 Javascript
vue使用自定义指令实现拖拽
Jan 29 Javascript
深入学习Vue nextTick的用法及原理
Oct 08 Javascript
JS脚本实现定时到网站上签到/签退功能
Apr 22 Javascript
使用JavaScript通过前端发送电子邮件
May 22 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
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
Codeigniter发送邮件的方法
2015/03/19 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
利用PHPExcel读取Excel的数据和导出数据到Excel
2017/05/12 PHP
PHP二维关联数组的遍历方式(实例讲解)
2017/10/18 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
jQuery里filter()函数与find()函数用法分析
2015/06/24 Javascript
JavaScript函数学习总结以及相关的编程习惯指南
2015/11/16 Javascript
浅谈在react中如何实现扫码枪输入
2018/07/04 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
2020/05/30 jQuery
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
python中的字典详细介绍
2014/09/18 Python
python创建进程fork用法
2015/06/04 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
django用户注册、登录、注销和用户扩展的示例
2018/03/19 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
用Django写天气预报查询网站
2018/10/21 Python
对Pandas MultiIndex(多重索引)详解
2018/11/16 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
浅谈tensorflow中张量的提取值和赋值
2020/01/19 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
聊城大学毕业生自荐书
2014/02/01 职场文书
群众路线教育实践活动调研报告
2014/11/03 职场文书
全网非常详细的pytest配置文件
2022/07/15 Python