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 相关文章推荐
top.location.href 没有权限 解决方法
Aug 05 Javascript
jquery刷新页面的实现代码(局部及全页面刷新)
Jul 11 Javascript
jQuery学习笔记 获取jQuery对象
Sep 19 Javascript
JS+CSS实现分类动态选择及移动功能效果代码
Oct 19 Javascript
jQuery实现拖动剪裁图片作为头像
Dec 28 Javascript
vue2组件实现懒加载浅析
Mar 29 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
May 09 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
Jul 28 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
Oct 26 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
May 08 Javascript
js实现有趣的倒计时效果
Jan 19 Javascript
JavaScript如何实现防止重复的网络请求的示例
Jan 28 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
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
php函数连续调用实例分析
2015/07/30 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
this[] 指的是什么内容 讨论
2007/03/24 Javascript
JScript的条件编译
2007/05/29 Javascript
javascript 动态生成私有变量访问器
2009/12/06 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
浅谈vuepress 踩坑记
2018/04/18 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
记录一篇关于redux-saga的基本使用过程
2018/08/18 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
Python中实现的RC4算法
2015/02/14 Python
python连接远程ftp服务器并列出目录下文件的方法
2015/04/01 Python
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
使用Python从有道词典网页获取单词翻译
2016/07/03 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
Python文件读写常见用法总结
2019/02/22 Python
Python读取YAML文件过程详解
2019/12/30 Python
django rest framework 过滤时间操作
2020/07/12 Python
python批量修改文件名的示例
2020/09/27 Python
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
JavaScript 反射学习技巧
2021/10/16 Javascript