当前位置: 首页 > 图文教程 > 网络编程 > Javascript > COM中获取JavaScript数组大小的代码

Javascript
Jquery 基础学习笔记
javascript 进度条的几种方法
Jquery中的offset()和position()深入剖析
基于Jquery 好友选择器V2.0
AJAX 仿EXCEL表格功能
网页和浏览器兼容性问题汇总(draft1)
JAVASCRIPT 点击显示 隐藏层
jQuery 学习 几种常用方法
JavaScript 动态改变图片大小
javascript 树控件 比较好用
Javascript Tab 导航插件 (23个)
JavaScript talbe表中指定位置插入一行的实现代码 修正版
js 操作css实现代码
Javascript 错误处理的几种方法
FireFox JavaScript全局Event对象
jquery.alert 弹出式复选框实现代码
jQuery Ajax文件上传(php)
jquery 上下滚动广告
JS 拼图游戏 面向对象,注释完整。
javascript 控制图片播放代码

Javascript 中的 COM中获取JavaScript数组大小的代码


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 135 ::
收藏到网摘: n/a

JavaScript调用COM传递数组时,在COM接口端,接收到的是VARIANT类型对象,如array,该对象的vt类型VT_DISPATCH,因此其值表示的是一个IDispatch类型的指针。 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中结构体的最佳替代方式(传递方式)。