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:void(0)的问题使用探讨
Apr 10 Javascript
javascript实现简单的html5视频播放器
May 06 Javascript
Node.js Streams文件读写操作详解
Jul 04 Javascript
分享bootstrap学习笔记心得(组件及其属性)
Jan 11 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
Apr 13 Javascript
vue.js开发环境搭建教程
May 04 Javascript
详解express + mock让前后台并行开发
Jun 06 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 Javascript
了解在JavaScript中将值转换为字符串的5种方法
Jun 06 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 Javascript
layui多iframe页面控制定时器运行的方法
Sep 05 Javascript
js+canvas绘制图形验证码
Sep 21 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脚本数据库功能详解(上)
2006/10/09 PHP
PHP答题类应用接口实例
2015/02/09 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
如何判断图片地址是否失效
2007/02/02 Javascript
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
jquery1.5.1中根据元素ID获取元素对象的代码
2011/04/02 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
JavaScript中匿名函数的用法及优缺点详解
2016/06/01 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
解决vue热替换失效的根本原因
2018/09/19 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
Python中处理字符串之endswith()方法的使用简介
2015/05/18 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
日语翻译个人求职的自我评价
2013/10/14 职场文书
招商业务员岗位职责
2013/12/16 职场文书
工伤赔偿协议书
2014/04/15 职场文书
小学教师师德整改措施
2014/09/29 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
停水通知
2015/04/16 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
详解redis在微服务领域的贡献
2021/10/16 Redis
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python