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 相关文章推荐
在JS数组特定索引处指定位置插入元素的技巧
Aug 24 Javascript
jquery根据锚点offset值实现动画切换
Sep 11 Javascript
jQuery中:checked选择器用法实例
Jan 04 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 Javascript
javascript新闻跑马灯实例代码
Jul 29 Javascript
vue.js事件处理器是什么
Mar 20 Javascript
详解JS中的this、apply、call、bind(经典面试题)
Sep 19 Javascript
在vue中使用css modules替代scroped的方法
Mar 10 Javascript
深入理解JavaScript的async/await
Aug 05 Javascript
Three.js中矩阵和向量的使用教程
Mar 19 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
Mar 06 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
PHP之短标签开启设置
2013/06/17 PHP
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
ThinkPHP开发--使用七牛云储存
2017/09/14 PHP
php对微信支付回调处理的方法
2018/08/23 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
为Extjs加加速(javascript加速)
2010/08/19 Javascript
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
2015/08/06 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
javascript深拷贝(deepClone)详解
2016/08/24 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
微信小程序如何实现在线客服功能
2019/10/16 Javascript
[01:20:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第四场 8.26
2018/08/30 DOTA
详细介绍Python中的偏函数
2015/04/27 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
python使用Tkinter实现在线音乐播放器
2018/01/30 Python
python解析含有重复key的json方法
2019/01/22 Python
75条笑死人的知乎神回复,用60行代码就爬完了
2019/05/06 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
西班牙手机之家:Phone House
2018/10/18 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
学习教师法的心得体会
2014/09/03 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL