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 相关文章推荐
json简单介绍
Jun 10 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
Jan 12 Javascript
javascript 系统文件夹文件操作及参数介绍
Jan 08 Javascript
javascript实现TreeView 无刷新展开的实例代码
Jul 13 Javascript
深入理解javascript作用域和闭包
Sep 23 Javascript
使用AngularJS创建自定义的过滤器的方法
Jun 18 Javascript
Bootstrap每天必学之导航
Nov 26 Javascript
详解基于Bootstrap扁平化的后台框架Ace
Nov 27 Javascript
js将json格式的对象拼接成复杂的url参数方法
May 25 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
Apr 19 Javascript
Angular2搜索和重置按钮过场动画
May 24 Javascript
利用js编写网页进度条效果
Oct 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
PHP array_push 数组函数
2009/12/26 PHP
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
jQuery实现在列表的首行添加数据
2015/05/19 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
微信小程序 slider的简单实例
2017/04/19 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
python实现备份目录的方法
2015/08/03 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
Python各种扩展名区别点整理
2020/02/27 Python
Python Selenium 设置元素等待的三种方式
2020/03/18 Python
Pytest如何使用skip跳过执行测试
2020/08/13 Python
提高python代码运行效率的一些建议
2020/09/29 Python
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
料理师求职信
2014/01/30 职场文书
教师年度考核评语
2014/04/28 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
浅谈Python响应式类库RxPy
2021/06/14 Python