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 相关文章推荐
ExtJS Store的数据访问与更新问题
Apr 28 Javascript
Ext对基本类型的扩展 ext,extjs,format
Dec 25 Javascript
jQuery的选择器中的通配符[id^='code']或[name^='code']及jquery选择器总结
Dec 24 Javascript
JavaScript中的对象和原型(一)
Aug 12 Javascript
深入理解jQuery.data() 的实现方式
Nov 30 Javascript
利用C/C++编写node.js原生模块的方法教程
Jul 07 Javascript
在页面中引入js的两种方法(推荐)
Aug 29 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
Sep 28 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
Mar 13 Javascript
JavaScript实现密码强度实时验证
Mar 18 Javascript
JS中的变量作用域(console版)
Jul 18 Javascript
uniapp 微信小程序 自定义tabBar 导航
Apr 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面象对象数据库操作类实例
2014/12/02 PHP
浅谈php中curl、fsockopen的应用
2016/12/10 PHP
Git命令之分支详解
2021/03/02 PHP
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
jQuery实现简单的手风琴效果
2020/04/17 jQuery
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
Javascript删除数组里的某个元素
2019/02/28 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
python比较2个xml内容的方法
2015/05/11 Python
Python简单生成随机数的方法示例
2018/03/31 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
python groupby 函数 as_index详解
2019/12/16 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
python标准库OS模块函数列表与实例全解
2020/03/10 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
教师职位说明书
2014/07/29 职场文书
装修活动策划方案
2014/08/27 职场文书
2014年后勤工作总结范文
2014/12/16 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
2016公司新年问候语
2015/11/11 职场文书
Python基础之条件语句详解
2021/06/16 Python
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python