zoukankan      html  css  js  c++  java
  • (转) 如何在JavaScript与ActiveX之间传递数据1

    本文研究如何在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;    // 保证有''结尾

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

  • 相关阅读:
    NET VBCSCompiler.exe占用100%,造成项目卡顿的的解决方法
    C#导出word [无规则表结构+模板遇到的坑]
    mysql允许远程连接的命令
    bootstrap-table的一些基本使用及表内编辑的实现
    在 VS2015+EF6.0中使用Mysql 遇到的坑
    NET使用SuperSocket完成TCP/IP通信
    GRPC在NET上的应用
    NET SignaiR 实现消息的推送,并使用Push.js实现通知
    运维自动化之4
    运维自动化之3
  • 原文地址:https://www.cnblogs.com/jzxx/p/5520903.html
Copyright © 2011-2022 走看看