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获取鼠标点击元素对象(示例代码)
Dec 20 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
Mar 08 Javascript
html的DOM中document对象anchors集合用法实例
Jan 21 Javascript
jquery实现未经美化的简洁TAB菜单效果
Aug 28 Javascript
JS实现的表格行鼠标点击高亮效果代码
Nov 27 Javascript
javascript RegExp 使用说明
May 21 Javascript
多种jQuery绑定事件的实现方式
Jun 13 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
Nov 09 Javascript
React如何避免重渲染
Apr 10 Javascript
VUE渲染后端返回含有script标签的html字符串示例
Oct 28 Javascript
结合axios对项目中的api请求进行封装操作
Sep 21 Javascript
小程序实现筛子抽奖
May 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
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
php计算一个文件大小的方法
2015/03/30 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
javascript实现删除前弹出确认框
2015/06/04 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
vue3.0搭配.net core实现文件上传组件
2020/10/29 Javascript
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
python爬虫之百度API调用方法
2017/06/11 Python
python并发编程之线程实例解析
2017/12/27 Python
详解pandas安装若干异常及解决方案总结
2019/01/10 Python
Python 3 实现定义跨模块的全局变量和使用教程
2019/07/07 Python
如何使用Python自动控制windows桌面
2019/07/11 Python
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
Java中compareTo和compare的区别
2016/04/12 面试题
作为网站管理者应当如何防范XSS
2014/08/16 面试题
运动会邀请函范文
2014/02/06 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
贷款担保申请书
2014/05/20 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
特岗教师个人总结
2015/02/10 职场文书
英语读书笔记
2015/07/02 职场文书
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript