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 相关文章推荐
jquery中常用的SET和GET
Jan 13 Javascript
safari,opera嵌入iframe页面cookie读取问题解决方法
Jun 23 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
May 28 Javascript
js实现简单的星级选择器提交效果适用于评论等
Oct 18 Javascript
基于jquery实现的自动补全功能
Mar 12 Javascript
JavaScript中var关键字的使用详解
Aug 14 Javascript
jQuery对html元素的取值与赋值实例详解
Dec 18 Javascript
javascript从作用域链谈闭包
Jul 29 Javascript
JavaScript类型检测之typeof 和 instanceof 的缺陷与优化
Jan 13 Javascript
AngularJS 应用身份认证的技巧总结
Nov 07 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
Dec 05 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
Jan 22 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学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
Js event事件在IE、FF兼容性问题
2011/01/01 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
jQuery setTimeout()函数使用方法
2013/04/07 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
讲解vue-router之什么是嵌套路由
2018/05/28 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
python 切片和range()用法说明
2013/03/24 Python
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
Python实现类继承实例
2014/07/04 Python
Django用户认证系统 User对象解析
2019/08/02 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
宝信软件JAVA工程师面试经历
2012/08/19 面试题
如何实现一个自定义类的序列化
2012/05/22 面试题
大学专科生推荐信范文
2013/11/23 职场文书
测试工程师职业规划书
2014/02/06 职场文书
小学教学随笔感言
2014/02/26 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
租房安全协议书
2014/08/20 职场文书
委托书如何写
2014/08/30 职场文书
2015届大学生就业推荐表自我评价
2014/09/27 职场文书