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 相关文章推荐
Javascript 复制数组实现代码
Nov 26 Javascript
解析Javascript中难以理解的11个问题
Dec 09 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
Jan 07 Javascript
JS获取表格内指定单元格html内容的方法
Mar 31 Javascript
JS实现文档加载完成后执行代码
Jul 09 Javascript
JavaScript之AOP编程实例
Jul 17 Javascript
Bootstrap表单布局
Jul 19 Javascript
详解webpack 多入口配置
Jun 16 Javascript
基于jQuery封装的分页组件
Jun 26 jQuery
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
Dec 09 Javascript
JavaScript常见继承模式实例小结
Jan 11 Javascript
mock.js模拟前后台交互
Jul 25 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文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
thinkPHP和onethink微信支付插件分享
2019/08/11 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
关于js类的定义
2011/06/28 Javascript
关于jquery性能最佳实践的讨论,与求教
2012/03/30 Javascript
js中用window.open()打开多个窗口的name问题
2014/03/13 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
基于JSONP原理解析(推荐)
2017/12/04 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
javascript将扁平的数据转为树形结构的高效率算法
2020/02/27 Javascript
Python中字典和JSON互转操作实例
2015/01/19 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
python MySQLdb使用教程详解
2018/03/20 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
解决pyttsx3无法封装的问题
2018/12/24 Python
Python发展简史 Python来历
2019/05/14 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
naturalizer加拿大官网:美国娜然女鞋
2017/04/04 全球购物
高中自我鉴定
2013/12/20 职场文书
2014年上半年工作自我评价
2014/01/18 职场文书
《口技》教学反思
2014/02/21 职场文书
投标承诺函范文
2015/01/21 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
一文搞懂redux在react中的初步用法
2021/06/09 Javascript
Oracle 死锁的检测查询及处理
2021/09/25 Oracle