COM中获取JavaScript数组大小的代码
2009-11-22 00:00
375 查看
IDispatch类型的指针,则表明该数组对象实际是一个JavaScript的内建数组对象,在JavaScript端,我们可以通过length属性来得到数组的大小,那么在此处,可以通过GetIDsOfNames函数和Invoke函数来获取数组长度,这样可以动态变量数组内容。
这个时候,nLength获得得到的就是数组的长度。
在JavaScript中的数组时一个对象,数组内容则是该对象的属性,是动态被创建的,这些属性的查询方式与length的查询方式有些类似,也是GetIDsOfNames和Invoke函数,主要差别在于名字的区别,数组中元素对象的属性,其名字是动态创建,也就是可以通过下标方式方式获取,因此,在此处,也可以通过下标方式获取该属性名称,具体如下:
于是通过这两种属性方式的调用,就可以在COM接口中便利所有的JavaScript数组对象了。
这个有什么好处呢,在查看很多网上资源的时候,发现大部分采用SAFEARRAY方式对结构体进行处理,传入到COM接口中,但SAFEARRAY在MIDL中并不被支持,而且JavaScript对象本身也不支持这个内容,要对SAFEARRAY方式操作,需要切换VBScript和JavaScript两种语言,这会导致程序编写的困难和维护人员的困惑。
直接采用JavaScript方式传入数组,对数组任意方式进行整合,就不需要通过SAFEARRAY方式进行结构体整合。同时,由于JavaScript中的每一个对象(元素)都带有本身的类型信息,因此,JavaScript中的数组时C中结构体的最佳替代方式(传递方式)。
// 获取数组长度 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中结构体的最佳替代方式(传递方式)。
相关文章推荐
- COM中获取JavaScript数组大小
- 使用JavaScript获取PHP代码中的数组
- JavaScript获取图片真实大小代码实例
- javascript获取COM或ATL返回的数组(整型或字符串数组)VBArray相关
- Javascript实现获取窗口的大小和位置代码分享
- JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)_javascript技巧_
- JavaScript获取图片真实大小代码实例
- Javascript实现获取窗口的大小和位置代码分享
- 如何获取动态数组的大小
- JS获取IE上传文件路径、后缀、大小、文件名代码
- 9行javascript代码获取QQ群成员具体实现
- JavaScript通过Class Name获取一个对象的数组
- javascript获取asp.net后台代码的方法
- 获取JavaScript用户自定义类的类名称的代码
- javascript 获取网页的大小
- JavaScript获取页面大小,滚动条位置,元素位置
- 用Javascript读取CheckBox数组的值的代码(兼容IE与firefox)
- JavaScript获取onclick、onchange等事件值的代码