社区
ActiveX/COM/DCOM
帖子详情
COM如何向javascript传递数组?
jaffy
2010-12-02 09:41:29
现在在写一个自动化应用,之前的脚本都是javascript的,现在需要新增加一个接口,需要传递数组,以前都是用函数带参数的形式传给脚本,现在觉得应该可以直接获得数组的;VBscript不就可以通过SAFEARRAY获取吗?但问题是在javascript中如何获取啊?高人请不吝赐教。
...全文
268
8
打赏
收藏
COM如何向javascript传递数组?
现在在写一个自动化应用,之前的脚本都是javascript的,现在需要新增加一个接口,需要传递数组,以前都是用函数带参数的形式传给脚本,现在觉得应该可以直接获得数组的;VBscript不就可以通过SAFEARRAY获取吗?但问题是在javascript中如何获取啊?高人请不吝赐教。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
雲遥
2012-11-02
打赏
举报
回复
2楼正解
jaffy
2010-12-22
打赏
举报
回复
一是 把函数定义成需要传入一个数组作为参数,在函数内部进行填充。
在函数内部填充后,JS能够像指针那样获得填充后的数据吗?最好给个例子
二是 函数 return 数组样式的字符串,如“[1,2,3]”,js 接收返回值后用 eval 变成数组
返回一个字符串的方式倒是简单,但关键是我希望脚本编写者的外部处理尽量少,这样便于他们理解和编写。
我现在是通过定义一个函数带INDEX参数来返回数组中的数值。这样理解起来倒简单,只是感觉不太规范。
laowang2
2010-12-22
打赏
举报
回复
顶顶
myy
2010-12-22
打赏
举报
回复
[Quote=引用 4 楼 jaffy 的回复:]
可我现在需要的是反向啊,就是COM往JAVASCRIPT传递,如何传递啊
[/Quote]
“COM往JAVASCRIPT传递”是什么意思?是不是函数 return 一个数组?
这样有两个简单办法,
一是 把函数定义成需要传入一个数组作为参数,在函数内部进行填充。
二是 函数 return 数组样式的字符串,如“[1,2,3]”,js 接收返回值后用 eval 变成数组。
jaffy
2010-12-22
打赏
举报
回复
可我现在需要的是反向啊,就是COM往JAVASCRIPT传递,如何传递啊
我不懂电脑
2010-12-21
打赏
举报
回复
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中结构体的最佳替代方式(传递方式)。
Endoresu
2010-12-21
打赏
举报
回复
oleaut32.dll提供了许多创建数组的API
比如创建一个简单的1维数组,可以用SafeArrayCreateVector函数
php实现向
javascript
传递
数组
的方法
主要介绍了php实现向
javascript
传递
数组
的方法,涉及php
数组
转json
传递
到
javascript
的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
php通过json
传递
数组
到
javascript
php具有强大的后端处理能力,其生成的数据,尤其是
数组
,通过json
传递
给
javascript
.本文中演示的例子是一个文件的数据传送。
Javascript
基础到入门
Javascript
基础到入门视频,该课程主要围绕
JavaScript
能做什么?
JavaScript
应用场合、
JavaScript
的学习方法三大话题展开教学。 讲师介绍:张中强,诺客科技技术总监/研发总监。 丰富的项目经验,善于用精炼的代码来...
javascript
数组
与php
数组
的地址
传递
及值
传递
用法实例
本文实例讲述了
javascript
数组
与php
数组
的地址
传递
及值
传递
用法。分享给大家供大家参考。具体如下:
javascript
数组
为地址
传递
/引用
传递
,而php
数组
为值
传递
实例代码如下: 复制代码 代码如下:<?php $arr = array(3,9,4); function test($arr){ $arr[0] = 30; } test($arr); foreach($arr as $val){ echo $val.” “; } ?> [removed] var myarr = [343,90
JS不能向WASM
传递
数组
?
自从把OFFICE编译为wasm之后,吾就想解决怎样
传递
数组
的事情。结果在TeaVM问题列表中,看到这样一个内容: https://github.
com
/konsoletyper/teavm/issues/379
ActiveX/COM/DCOM
703
社区成员
3,002
社区内容
发帖
与我相关
我的任务
ActiveX/COM/DCOM
C++ Builder ActiveX/COM/DCOM
复制链接
扫一扫
分享
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章