本文研究如何在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. UEFI GPT

    其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...

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

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

  3. android 三目运算符 运用错误

    /************************************************************************** * android 三目运算符 运用错误 * 说 ...

  4. dataguard 日志传输服务

    1.日志传输可以分为 lgwr和ARCH,默认是arch,其中lgwr传输可以分为async和syncsync:同步服务,只有在事物参数的日志成功的传输到备库的目的地,事物才能提交.虽然同步服务没有限 ...

  5. span文字在左背景图片在右

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  6. 《Oracle Database 12c DBA指南》第一章 - 基本技能简介

    当前关于12c的中文资料比较少,本人将关于DBA的一部分官方文档翻译为中文,很多地方为了帮助中国网友看懂文章,没有按照原文句式翻译,翻译不足之处难免,望多多指正. 1 基本技能简介 作为一个数据库管理 ...

  7. 用COM方式快速导出到Excel一例,批量导出

    开发中用到填充Excel时,一个一个的填充不免太慢,现有用数组方式填充一例,可以实现COM方式快速填充. C#,VBA中用法类似 适用场景:需要自动化操作Excel的方式下使用,比较除填充数据外还要自 ...

  8. android AudioRecord 与 AudioTrack的录音加回放的使用

    http://stackoverflow.com/questions/32682952/audiotrack-audiotack-not-playing-fully-recorded-audio

  9. hdu5773--The All-purpose Zero(LIS变形)

    题意:给一个非负整数的数列,其中0可以变成任意整数,包括负数,求最长上升子序列的长度. 题解:LIS是最简单的DP了,但是变形之后T^T真的没想到.数据范围是10^5,只能O(nlogn)的做法,所以 ...

  10. elecworks无法连接至协同服务器

    http://jingyan.baidu.com/article/597a0643759e1c312b524385.html 在安装路径中找到Server文件夹,在文件夹中你可以看到只有一个文件[Ew ...