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框架(Javascript Framework)
Nov 22 Javascript
Document.location.href和.replace的区别示例介绍
Mar 04 Javascript
JavaScript事件委托的技术原理探讨示例
Apr 17 Javascript
JQuery给元素绑定click事件多次执行的解决方法
May 29 Javascript
微信小程序 登录实例详解
Jan 16 Javascript
教你用十行node.js代码读取docx的文本
Mar 08 Javascript
Javascript实现信息滚动效果
May 18 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
Nov 09 Javascript
JS严格模式知识点总结
Feb 27 Javascript
JS限制输入框输入的实现代码
Jul 02 Javascript
vscode中Vue别名路径提示的实现
Jul 31 Javascript
JavaScript中isPrototypeOf函数
Nov 07 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 文件上传模型,支持多文件上传
2009/08/13 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
三种php连接access数据库方法
2013/11/11 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
2013/11/07 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
基于Python os模块常用命令介绍
2017/11/03 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
python smtplib发送带附件邮件小程序
2018/05/22 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
python Django 创建应用过程图示详解
2019/07/29 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
中央空调节能方案
2014/06/15 职场文书
2014年教师节演讲稿范文
2014/09/10 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
自愿离婚协议书范文2014
2014/10/12 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
小学生暑假安全保证书
2015/07/13 职场文书