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 相关文章推荐
prototype 的说明 js类
Sep 07 Javascript
使用正则替换变量
May 05 Javascript
jQuery 跨域访问问题解决方法
Dec 02 Javascript
自动刷新网页,自动刷新当前页面,JS调用
Jun 24 Javascript
JavaScript中的数组特性介绍
Dec 30 Javascript
多种JQuery循环滚动文字图片效果代码
Jun 23 Javascript
用js实现博客打赏功能
Oct 24 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
Nov 30 Javascript
JavaScript判断浏览器及其版本信息
Jan 20 Javascript
详解express与koa中间件模式对比
Aug 07 Javascript
Angular模版驱动表单的使用总结
May 05 Javascript
vue的webcamjs集成方式
Nov 16 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
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
AngularJS辅助库browserTrigger用法示例
2016/11/03 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
详解如何运行vue项目
2019/04/15 Javascript
JS实现简单tab选项卡切换
2019/10/25 Javascript
Vue中axios拦截器如何单独配置token
2019/12/27 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
vue3.0 上手体验
2020/09/21 Javascript
Python 文件重命名工具代码
2009/07/26 Python
python读写文件操作示例程序
2013/12/02 Python
Python随机生成带特殊字符的密码
2016/03/02 Python
python访问抓取网页常用命令总结
2017/04/11 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
Python partial函数原理及用法解析
2019/12/11 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
婚庆公司的创业计划书
2014/01/22 职场文书
技校个人求职信范文
2014/01/25 职场文书
安踏广告词改编版
2014/03/21 职场文书
我的理想演讲稿
2014/04/30 职场文书
食品安全宣传标语
2014/06/07 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
JavaScript实现简单计时器
2021/06/22 Javascript
vue中data里面的数据相互使用方式
2022/06/05 Vue.js