本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口。使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等。
本文将研究以下几个方面:
- 整型数组传参
- 字符串参数,字符串返回值
- 修改传入字符串内容
- 数组参数
- IDispatch接口介绍
- 修改输入数组内容
- 增加数组内容
- 以数组传参方式,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:;<=
分享到:
相关推荐
在Windows应用程序开发中,Microsoft Foundation Class (MFC)库提供了一种封装ActiveX技术的方式,使得C++开发者能够利用各种ActiveX控件,包括WebBrowser控件。WebBrowser控件允许在MFC应用中嵌入网页浏览功能,而...
在网页开发中,经常需要在不同的表单之间传递数据。这种需求可以通过JavaScript来实现。通过编写适当的JavaScript代码,可以轻松地获取一个表单中的数据,并将其设置到另一个表单中。 #### 表单元素的选择与操作 在...
通过以上介绍,我们可以了解到ActiveX组件与JavaScript之间的交互不仅可以实现基本的事件触发,还可以实现更复杂的数据交换。这种技术的应用非常广泛,特别是在早期的Web应用开发中。随着Web技术的发展,虽然ActiveX...
- **ActiveX脚本**:这是一种用于控制ActiveX组件的技术,通常使用VBScript或JavaScript编写。它使得开发者能够动态地修改页面内容或响应用户事件。 - **VBScript**:一种轻量级的脚本语言,专为客户端和服务器端...
【atl-ActiveX-dll-inf-cab-web调用(总结篇)】 这篇文章是对利用C++进行ActiveX控件和DLL的开发以及将其嵌入到Web网页中的技术进行的总结。ActiveX是微软的一种技术,允许在不同的应用程序之间共享组件,而DLL...
3. 事件驱动:通过监听控件的事件,网页可以响应控件的行为,并通过事件处理函数传递数据。 四、注意事项 1. 兼容性:ActiveX主要适用于Internet Explorer,其他现代浏览器如Chrome、Firefox并不支持。因此,需要...
两者之间的交互,可以让桌面应用和Web页面之间实现数据传递和控制。 首先,我们要理解ActiveX的工作原理。ActiveX控件是二进制代码,可以嵌入到HTML页面中,通过JavaScript进行调用。当用户访问包含ActiveX控件的...
4. **数据通信**:可能使用JSON格式进行数据交换,因为它是Web服务和客户端之间传递数据的常见方式。 5. **前端路由**:如果项目包含多页面,可能会用到Vue Router进行页面跳转和路由管理。 6. **状态管理**:如果...
在本资源"javascript经典特效---IFRAME间链接变换.rar"中,我们聚焦于一个特定的JavaScript特效:如何在多个IFRAME之间进行链接的变换。 IFRAME(Inline Frame)是HTML中的一个元素,它允许在一个页面中嵌入另一个...
总之,本文介绍了一种利用JavaScript和ActiveX对象在Internet Explorer中将HTML表格数据导出到Excel和Word的技巧。尽管这种方法在现代Web开发中已经不再常见,但它仍然是一种了解JavaScript与桌面应用交互的示例,...
数据传递则涉及到如何在不同作用域之间传递数据。在JavaScript中,常见的数据传递方式包括: - 函数参数:通过函数调用来传递数据是最直接的方式,可以确保数据只在函数执行期间可见。 - 返回值:函数执行完成后,...
在IT领域,ActiveX与JavaScript之间的数据交换是一个重要的技术主题,尤其在开发Web应用程序时,两者间的交互可以实现丰富的客户端功能。ActiveX是Microsoft推出的一种技术,主要用于Windows平台,允许对象(如控件...
在ActiveX控件与JavaScript之间传递参数,通常使用事件驱动机制。在JavaScript中,我们可以通过`<script>`标签定义一个事件监听器,该监听器绑定到特定的ActiveX对象,并指定一个处理函数。例如: ```html ...
而ActiveX技术则是一种允许在不同应用程序之间共享组件的技术,常用于创建网页交互性控件。本篇文章将详细探讨如何使用VS2010中的MFC来创建ActiveX控件,并进一步进行打包和在WEB环境下调用。 首先,我们需要了解...
这可以通过JavaScript在浏览器端实现,然后通过ActiveX控件与JavaScript的交互传递给服务器。 3. **JavaScript与ActiveX交互** - **安全设置**:由于ActiveX控件有潜在的安全风险,用户必须在IE中启用ActiveX才能...
JavaScript 使用ActiveX实现在Excel文件中插入图片
JavaScript利用ActiveX导出Excel,Word
在传递数据时,需要注意变量名的大小写问题。 * 数据类型问题:VFP和JavaScript之间的数据类型不同,需要进行相应的数据类型转换。 4. 使用VFP和JavaScript实现数据交互 使用VFP和JavaScript实现数据交互需要完成...
在本文中,我们将深入探讨如何实现Qt与ECharts之间的JSON数据交互。ECharts是一个基于JavaScript的开源图表库,而Qt则是一个跨平台的应用程序开发框架,广泛用于桌面和移动平台。将这两者结合,可以创建出具有丰富...