本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口。使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等。
本文将研究以下几个方面:

1.         整形数组传参

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

3.         修改传入字符串内容

4.         数组参数

5.         IDispatch接口介绍

6.         修改输入数组内容

7.         增加数组内容

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

(一)整形参数

1.         整形参数,可直接传递。整形返回值需要以 [retVal] Long *方式声明
2.        COM中c++接口定义

STDMETHODIMP CJsAtl::IntSum(LONG a, LONG b, LONG* retVal)

{

*retVal = a + b;

return S_OK;

}

3.        Js中调用

<object id="obj" classid="CLSID:AD694878-......"> </object>

function test_int()

{

var a = 1;

var b = 2;

try {

var obj = document.getElementByIdx_xx_x("obj");

var retVal = obj.IntSum(a, b);

Alert("RetVal: " + retVal);

} catch (e) {

Alert( "Js error: " + e.message);

}

}

(二)字符串参数,字符串返回值

1.         COM中,字符串使用BSTR表示,BSTR实际是UNICODE 字符数组(WCHAR[])

2.         COM字符串传参规范中规定:

a)         生成字符串变量时,需要SysAllocString/SysAllocStringByteLen分配空间。

b)        函数结束前,分配的空间需要释放,SysFreeString。

c)         若函数中分配的空间作为返回值,则不释放。而由外部调用者负责释放。

3.         COM中c++函数定义

STDMETHODIMP CJsAtl::StringAdd(BSTR str1, BSTR str2, BSTR* retVal)

{

int len = SysStringLen(str1);

len += SysStringLen(str2);

len += 4;    // 保证有'\0'结尾

BSTR result = SysAllocStringLen(NULL, len);

memset(result, 0, len * 2);      // 双字节字符

StrCat(result, str1);

StrCat(result, str2);

*retVal = result; // 设置返回值指针。注:不释放内存

return S_OK;

}

4.         JS中调用

function test_str_cat()

{

var a = "123";

var b = "abc";

try {

var obj = document.getElementByIdx_xx_x("obj");

var retVal = obj.StringAdd(a, b);

alert("RetVal: " + retVal);

} catch (e) {

alert("JS ERROR: " + e.message);

}

}

(三)修改传入字符串内容

1.         原则上,不应修改传入字符串的内存数据,否则可能破坏数据,造成js端异常。

2.         使用中,可通过修改传入字符串缓冲区内容的方法,实现参数传递。

3.         不能使用SysFreeString破坏传入的BSTR参数,否则会破坏js内存结构

4.         COM中C++定义

STDMETHODIMP CJsAtl::StrModify(BSTR str)

{

int len = SysStringLen(str);   // 注:此方法修改BSTR,不能破坏原占用内存,不能越界访问

for (int i = 0; i < len; i++)

str[i] = '0' + i;

return S_OK;

}

5.         JS调用

function test_str_modify()

{

var str = "abcdefghijklmn";

try {

var obj = document.getElementByIdx_xx_x("obj");

obj.StrModify(str);

alert("After modify: " + str);

} catch (e) {

alert("JS ERROR: " + e.message);

}

}

6.         测试执行

原字符串:    abcdefghijklmn

调用后:       0123456789:;<=

(转) 如何在JavaScript与ActiveX之间传递数据1的更多相关文章

  1. (转)如何在JavaScript与ActiveX之间传递数据3

    本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...

  2. (转)如何在JavaScript与ActiveX之间传递数据2

    本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...

  3. 【MVC架构】——怎样利用Json在View和Controller之间传递数据

    在MVC架构中,尽管非常多东西和三层非常相似,可是也有非常大的差别.就比方传递数据.在三层架构中,传递数据就仅仅要一层返回,另外一层用同样类型的变量来接收即可了.在MVC中,事实上原理是一样的,Con ...

  4. Activity之间传递数据的方式及常见问题总结

    Activity之间传递数据一般通过以下几种方式实现: 1. 通过intent传递数据 2. 通过Application 3. 使用单例 4. 静态成员变量.(可以考虑 WeakReferences) ...

  5. Controller之间传递数据:属性传值

    在项目中,Controller之间传递数据非常之多,这里简单介绍一下属性传值.例如有FirstController 和 SecondController,数据从First传递到Second中,我们如何 ...

  6. Activity之间传递数据或数据包Bundle,传递对象,对象序列化,对象实现Parcelable接口

    package com.gaojinhua.android.activitymsg; import android.content.Intent; import android.os.Bundle; ...

  7. 28、activity之间传递数据&批量传递数据

    import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android ...

  8. 【Android 复习】 : Activity之间传递数据的几种方式

    在Android开发中,我们通常需要在不同的Activity之间传递数据,下面我们就来总结一下在Activity之间数据传递的几种方式. 1. 使用Intent来传递数据 Intent表示意图,很多时 ...

  9. Android基础知识04—Activity活动之间传递数据

    ------活动之间传递数据------ 向下一个活动传递数据: Intent中提供了一系列的putExtra()方法,可以把数据暂存到Intent中,启动另一个活动的时候就可以取出来. 代码: (存 ...

随机推荐

  1. 漫谈MySql中的事务

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  2. POJ 1637 Sightseeing tour ★混合图欧拉回路

    [题目大意]混合图欧拉回路(1 <= N <= 200, 1 <= M <= 1000) [建模方法] 把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为 ...

  3. apache开源项目--HttpComponents

    HttpComponents 也就是以前的httpclient项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端/服务器编程工具包,并且它支持 HTTP 协议最新的版本和建议.不 ...

  4. java中volatitle关键字的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致 的情况.volatile就是用 ...

  5. NGINX(一)内存结构

    ngx_buf_t和ngx_chain_t是nginx中操作内存的重要手段, 很多的数据都需要通过这个结构进行保存. 其中ngx_buf_t中保存一块可用内存, ngx_chain_t则是将内存块连接 ...

  6. 【JMeter】ant+jmeter生成html报告

    源博文来自于  http://my.oschina.net/hellotest/blog/517518 主要应用于接口的回归或者性能的简单查看功能.操作为先在jmeter中写好测试计划,保存为jmx文 ...

  7. HDU 5634 Rikka with Phi 线段树

    题意:bc round 73 div1 D 中文题面 分析:注意到10^7之内的数最多phi O(log(n))次就会变成1, 因此可以考虑把一段相同的不为1的数缩成一个点,用平衡树来维护. 每次求p ...

  8. win7(64位)+IE8+QC9.0

    环境win7(64位)+IE8+QC9.0出现的问题IE8访问QC9.0有时访问登录显示正常,但是有时访问QC页面无法显示正常,然后在ie8中安全中设置“启用内存保护帮助减少联机攻击*”也无法找到该项 ...

  9. Tomcat 7 Connector 精读(2) 协议处理器 Http11Protocol(待续)

    . Http11Protocol是阻塞式IO的实现,上图的几个方法是它的生命周期相关的方法.

  10. jQuery中实现自定义方法的扩展

    JQuery包装器提供了大量的方法,可以再页面中直接使用.但是,没有 任何一个库可以满足所有的需求,所以,JQuery库提供了丰富的扩展功能 .以禁用一组表单元素为例,看看怎么简单有效的在JQuery ...