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 相关文章推荐
JS跨域总结
Aug 30 Javascript
文本框水印提示效果的简单实现代码
Feb 22 Javascript
详解AngularJS的通信机制
Jun 18 Javascript
Javascript实现的Map集合工具类完整实例
Jul 31 Javascript
详解Angular中$cacheFactory缓存的使用
Aug 19 Javascript
JavaScript每天必学之基础知识
Sep 17 Javascript
jQuery的extend方法【三种】
Dec 14 Javascript
微信小程序 数组中的push与concat的区别
Jan 05 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
Dec 16 Javascript
JS数组扁平化(flat)方法总结详解
Jun 24 Javascript
原生js+ajax分页组件
Jan 30 Javascript
原生javascript制作贪吃蛇小游戏的方法分析
Feb 26 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图片处理类(水印、等比缩放、固定高宽)分享
2015/06/19 PHP
PHP简单检测网址是否能够正常打开的方法
2016/09/04 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
javascript 命名规则 变量命名规则
2010/02/25 Javascript
Prototype源码浅析 String部分(三)之HTML字符串处理
2012/01/15 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
Clipboard.js 无需Flash的JavaScript复制粘贴库
2015/10/02 Javascript
7个jQuery最佳实践
2016/01/12 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
详解用node搭建简单的静态资源管理器
2017/08/09 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
JavaScript面向对象核心知识与概念归纳整理
2020/05/09 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
python实现抖音点赞功能
2019/04/07 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
HTML5 背景的显示区域实现
2020/07/09 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
《湘夫人》教学反思
2014/02/21 职场文书
陈欧广告词
2014/03/14 职场文书
作风建设演讲稿
2014/05/23 职场文书
暑期培训心得体会
2014/09/02 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
幼儿园母亲节活动总结
2015/02/10 职场文书
酒桌上的开场白
2015/06/01 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书