如何在JavaScript与ActiveX之间传递数据

 我来答
育知同创教育
2016-08-05 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部
在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口。使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等。

  1. 整形数组传参

  2. 字符串参数,字符串返回值

  3. 修改传入字符串内容

  4. 数组参数

  5. IDispatch接口介绍

  6. 修改输入数组内容

  7. 增加数组内容

  8. 以数组传参方式,JS调用S4Execute( )

1.
在使用时,有时需要使用数组传参,如S4Execute( )的inBuff/ outBuff。

2.
JS中整形数据不分Byte/ Short/ Int等,因此数组元素类型都为int (COM中的VT_I4,其中I表示整形、4表示4字节)

3.
JS中的Array在COM中是一个实现了IDispatch的对象,可通过IDispatch接口api进行操作。关于IDispatch请看下一节介绍。

4.
COM中C++定义

IDispatch接口介绍

1.
C程序调用时,调用者必须预先知道接口规范(如,参数类型、参数字节长度、参数顺序等)。由于不同语言这些规范有所不同,COM未解决不同语言之间调用,提供了IDispatch接口。

2.
IDispatch要求其实例必须自我描述,即拿到一个对象后,可从对象中直接获取调用方式,而无须预先明确。

3.
IDispatch中通过VT_TYPE来指定相关类型,如
VT_I4为4字节整形、VT_BSTR为unicode字符串,VT_DISPATCH表示是一个IDispatch对象

4.
给对象中每一属性或函数(Method)分配一个整形Id和一个字符串name,调用者可以通过name字符串确定如何调用。如,若name为"length"的属性,调用者就理解为长度。由于这里通常是根据name来理解相应属性,因此name描述应足够准确。如,以"length()"为名称的函数实现整数相加功能就是不恰当的。

5.
使用IDispatch对象时,首相调用 IDispatch::GetIDsOfNames()将属性、函数名称作为参数,获取对应的属性、函数id。

6.
再调用IDispatch::Invoke() 将id作为参数,实际调用功能。

7.
若为获取属性值,则 Invoke()调用时,传入 Dispatch_PropertyGet标志。

8.
若为设置属性值,则Invoke()调用时,传入 Dispatch_PropertyPut标志。并在
DispParams参数中指定修该属性改为何值。DispParams结构说明见后。

9.
若为调用函数,则 Invoke()调用时,传入
Dispatch_Method标志。若该Method需要参数,则通过IDispatch::Invoke()的DispParams参数指定。

修改输入数组内容

1.
第五节介绍了如何从JS向COM传递数组参数,以及如何在COM中获取参数。本节介绍如何在COM中修改JS传入的数组。

2.
修改JS数组值时,首先通过GetIDsOfNames获取指定序号元素的dispid;然后调用Invoke(),传入Dispatch_PropertyPut标志表明写操作,并在DispParams结构中指明此元素类型和元素值。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式