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

Javascript
给初学者提供几本学习js值得看的书
Javascript----文件操作
Vml+Js算法:完成5个小球在网页运动(碰壁返回)的游戏,详细注释
Vml+Dhtml:制作一个应用渐变颜色效果不错的进度条
Dhtml+Js算法:5个小球运动的简化版,变通实现更简单的飞行的图片
Vml+Dhtml:小小的页面效果,叫它"淘气鬼"好了
判断客户浏览器是否支持cookie
几种常用的表单输入判断
CSDN无限级树数据库版(ASP+ACCESS)
JavaScript 寫遊戲 : 俄羅斯方塊
JavaScript 寫遊戲 : 搬吖
JavaScript 遊戲 : 貪吃蛇
JavaScript 寫時鍾日曆
VML:经典的图片叠加效果(灰色调)
一个简单的仿xp的js下拉菜单
JScript 寫 sortNode
关于javascript中数组元素删除问题的讨论
IE中非模式对话框(showModelessDialog)应用
Dhtml:用ondrag事件简单的实现鼠标拖动物件.
对WebUI技术感兴趣的说

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2010-01-10   浏览: 50 ::
收藏到网摘: 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中结构体的最佳替代方式(传递方式)。