首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

JavaScript与ActiveX其间传递数据 - 连载一

2012-07-30 
JavaScript与ActiveX之间传递数据 - 连载一本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各

JavaScript与ActiveX之间传递数据 - 连载一

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

本文将研究以下几个方面:

  1. 整型数组传参
  2. 字符串参数,字符串返回值
  3. 修改传入字符串内容
  4. 数组参数
  5. IDispatch接口介绍
  6. 修改输入数组内容
  7. 增加数组内容
  8. 以数组传参方式,JS调用S4Execute()

由于本文篇幅较长,所以将以连载方式进行发表,连载一主要讨论1-3点,连载二主要讨论4-6点,连载三主要讨论7-8点。

(一)整型参数

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:;<=

热点排行