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 相关文章推荐
让网页根据不同IE版本显示不同的内容
Feb 08 Javascript
JavaScript移除数组元素减少长度的方法
Sep 05 Javascript
js中日期的加减法
May 06 Javascript
将form表单通过ajax实现无刷新提交的简单实例
Oct 12 Javascript
vue 请求后台数据的实例代码
Jun 22 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
代码整洁之道(重构)
Oct 25 Javascript
Three.JS实现三维场景
Dec 30 Javascript
如何在Vue.js中实现标签页组件详解
Jan 02 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
Sep 27 Javascript
js实现微信聊天效果
Aug 09 Javascript
使用Cargo工具高效创建Rust项目
Aug 14 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编写和读取XML的几种方式
2013/01/12 PHP
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
不同编码的页面表单数据乱码问题解决方法
2015/02/15 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
15款最好的Bootstrap在线编辑器
2016/08/03 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
webpack4 升级迁移的实现
2018/09/12 Javascript
详解微信小程序之一键复制到剪切板
2019/04/24 Javascript
JS学习笔记之原型链和利用原型实现继承详解
2019/05/29 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
[06:38]DOTA2怒掀电竞风暴 2013Chinajoy
2013/07/27 DOTA
python实现发送和获取手机短信验证码
2016/01/15 Python
django使用html模板减少代码代码解析
2017/12/12 Python
快速了解Python中的装饰器
2018/01/11 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
Python实现bilibili时间长度查询的示例代码
2020/01/14 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
台湾生鲜宅配:大口市集
2017/10/14 全球购物
一帮一活动总结
2014/05/08 职场文书
英语系毕业生求职信
2014/07/13 职场文书
班级出游活动计划书
2014/08/15 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android