`
leon.s.kennedy
  • 浏览: 111559 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

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

0
1
分享到:
评论

相关推荐

    MFC的WebBrowser控件 C++与JavaScript之间数据交互传递

    在Windows应用程序开发中,Microsoft Foundation Class (MFC)库提供了一种封装ActiveX技术的方式,使得C++开发者能够利用各种ActiveX控件,包括WebBrowser控件。WebBrowser控件允许在MFC应用中嵌入网页浏览功能,而...

    源代码——MFC的WebBrowser控件 C++与JavaScript之间数据交互传递

    可能包括了C++向JavaScript传递数据,例如传递地理位置信息,让JavaScript绘制地图;以及JavaScript向C++发送请求,比如用户在网页上点击某个位置,C++接收到坐标后进行特定的处理。 总之,通过MFC的WebBrowser控件...

    基于MFC的ActiveX控件开发(JS传递变量数据给控件)

    在JavaScript端,你可以使用document.createElement对象创建ActiveX控件实例,然后通过控件的属性或方法传递数据。例如,如果在MFC中定义了一个名为SetData的方法,你可以在JavaScript中这样调用: ```javascript ...

    activex-programming-unleashed-2nd-edition

    - **ActiveX脚本**:这是一种用于控制ActiveX组件的技术,通常使用VBScript或JavaScript编写。它使得开发者能够动态地修改页面内容或响应用户事件。 - **VBScript**:一种轻量级的脚本语言,专为客户端和服务器端...

    网页向ActiveX控件传递参数(C++ 的ocx)

    3. 事件驱动:通过监听控件的事件,网页可以响应控件的行为,并通过事件处理函数传递数据。 四、注意事项 1. 兼容性:ActiveX主要适用于Internet Explorer,其他现代浏览器如Chrome、Firefox并不支持。因此,需要...

    matlab开发-JavaScript 项目-vue-sui-demo.zip

    4. **数据通信**:可能使用JSON格式进行数据交换,因为它是Web服务和客户端之间传递数据的常见方式。 5. **前端路由**:如果项目包含多页面,可能会用到Vue Router进行页面跳转和路由管理。 6. **状态管理**:如果...

    javascript经典特效---IFRAME间链接变换.rar

    在本资源"javascript经典特效---IFRAME间链接变换.rar"中,我们聚焦于一个特定的JavaScript特效:如何在多个IFRAME之间进行链接的变换。 IFRAME(Inline Frame)是HTML中的一个元素,它允许在一个页面中嵌入另一个...

    chrome 浏览器加载activex

    1. **使用Chrome的兼容性模式**:某些版本的Chrome提供了“--enable-internal-activex”命令行开关,允许浏览器加载ActiveX控件。在启动Chrome时,可以通过在快捷方式的目标路径后添加这个开关来启用此功能。例如:...

    COM(activex)使用自定义类型传递数据

    2. 数据序列化与反序列化:为了在组件之间传递自定义类型,需要将数据结构转换为二进制流(序列化),并在接收端还原(反序列化)。COM提供了`IStream`接口来处理这种操作。 3. 注册:自定义类型通常需要注册到系统...

    jQuery+json异步实现JSP和struts2之间的数据传递

    "jQuery+json异步实现JSP和struts2之间的数据传递"是一个典型的应用场景,它结合了前端JavaScript库jQuery与后端MVC框架Struts2,通过JSON这种轻量级的数据交换格式进行高效的数据交互。下面我们将详细探讨这一主题...

    java\JavaScript利用ActiveX导出Excel,Word .doc

    总之,本文介绍了一种利用JavaScript和ActiveX对象在Internet Explorer中将HTML表格数据导出到Excel和Word的技巧。尽管这种方法在现代Web开发中已经不再常见,但它仍然是一种了解JavaScript与桌面应用交互的示例,...

    多浏览器兼容ActiveX控件解决方案 - KGChromePlugin V3.0 技术详解

    内容概要:介绍了金格科技开发的KGChromePlugin,这是一款旨在使ActiveX控件能够在非IE浏览器上(尤其是谷歌浏览器系列)正常工作的插件。主要讲述了插件的功能特点、安装配置、接口定义及其应用场景。通过...

    activex跟js数据交换例子程序

    在IT领域,ActiveX与JavaScript之间的数据交换是一个重要的技术主题,尤其在开发Web应用程序时,两者间的交互可以实现丰富的客户端功能。ActiveX是Microsoft推出的一种技术,主要用于Windows平台,允许对象(如控件...

    VS2010(VC++)-MFCActiveX-打包-WEB调用

    而ActiveX技术则是一种允许在不同应用程序之间共享组件的技术,常用于创建网页交互性控件。本篇文章将详细探讨如何使用VS2010中的MFC来创建ActiveX控件,并进一步进行打包和在WEB环境下调用。 首先,我们需要了解...

    Activex在线网页截图

    这可以通过JavaScript在浏览器端实现,然后通过ActiveX控件与JavaScript的交互传递给服务器。 3. **JavaScript与ActiveX交互** - **安全设置**:由于ActiveX控件有潜在的安全风险,用户必须在IE中启用ActiveX才能...

    一个用于将JSON数据转换为Table的JavaScript库

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。在前端开发中,我们经常需要将从服务器获取的JSON数据展示在网页的表格中,以便用户直观地查看和操作数据。...

    Unity3D和HTML之间传递信息的实现

    ### Unity3D与HTML之间传递信息的实现 #### 一、引言 Unity3D不仅是一款游戏引擎,更是一个跨平台的三维游戏与虚拟现实开发工具。它以其易用性、支持多脚本语言及强大的物理引擎等特点,在虚拟现实工程师中广受...

    JavaScript 使用ActiveX实现在Excel文件中插入图片

    JavaScript 使用ActiveX实现在Excel文件中插入图片

    JavaScript典型应用与最佳实践-源代码

    AJAX(异步JavaScript和XML)用于在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容。Fetch API是现代浏览器提供的一种替代XMLHttpRequest的新方法,更简洁易用。 9. **错误处理**: 使用`try...catch...

    JavaScript利用ActiveX导出Excel,Word

    JavaScript利用ActiveX导出Excel,Word

Global site tag (gtag.js) - Google Analytics