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

来源:互联网 发布:第二号码软件 编辑:程序博客网 时间:2024/06/05 17:57
本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COMIDispatch接口。使用类似的方法,可以推广到其他所有脚本型语言,如LUAAutoCad等。
本文将研究以下几个方面:

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

原创粉丝点击