(转) 如何在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; // 保证有'\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:;<=
(转) 如何在JavaScript与ActiveX之间传递数据1的更多相关文章
- (转)如何在JavaScript与ActiveX之间传递数据3
本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...
- (转)如何在JavaScript与ActiveX之间传递数据2
本文研究如何在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口.使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等.本文将研 ...
- 【MVC架构】——怎样利用Json在View和Controller之间传递数据
在MVC架构中,尽管非常多东西和三层非常相似,可是也有非常大的差别.就比方传递数据.在三层架构中,传递数据就仅仅要一层返回,另外一层用同样类型的变量来接收即可了.在MVC中,事实上原理是一样的,Con ...
- Activity之间传递数据的方式及常见问题总结
Activity之间传递数据一般通过以下几种方式实现: 1. 通过intent传递数据 2. 通过Application 3. 使用单例 4. 静态成员变量.(可以考虑 WeakReferences) ...
- Controller之间传递数据:属性传值
在项目中,Controller之间传递数据非常之多,这里简单介绍一下属性传值.例如有FirstController 和 SecondController,数据从First传递到Second中,我们如何 ...
- Activity之间传递数据或数据包Bundle,传递对象,对象序列化,对象实现Parcelable接口
package com.gaojinhua.android.activitymsg; import android.content.Intent; import android.os.Bundle; ...
- 28、activity之间传递数据&批量传递数据
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android ...
- 【Android 复习】 : Activity之间传递数据的几种方式
在Android开发中,我们通常需要在不同的Activity之间传递数据,下面我们就来总结一下在Activity之间数据传递的几种方式. 1. 使用Intent来传递数据 Intent表示意图,很多时 ...
- Android基础知识04—Activity活动之间传递数据
------活动之间传递数据------ 向下一个活动传递数据: Intent中提供了一系列的putExtra()方法,可以把数据暂存到Intent中,启动另一个活动的时候就可以取出来. 代码: (存 ...
随机推荐
- Window.Event.KeyCode=13
Window.Event.KeyCode=13是enter键处发windows事件,enter键的ASCII是13. <input type="password" name= ...
- memcached性能监控
在上文“在Windows .NET平台下使用Memcached”中,我给大家介绍了如何在Windows平台上部署Memecached服务端,如何在.NET平台中应用Memcached,详细介绍了两种流 ...
- jsp、js、html等
1.一个button标签怎么触发事件: 一般触发事件有两种方式,要么是在html直接绑定,即button标签中不只有class.type和id,还要写onclick=... 还有一种,就是在js代码部 ...
- C++ ODR规则与dlopen 问题
问题: 开发平台*.so插件的时候遇到相同的函数名称出现在不同的.so文件中,假设分别为a.so和b.so,b.so要使用a.so中的定义函数 a(),而在dlopen会先加载a.so然后加载b.so ...
- 解决JSP页面无法使用EasyUI里面class="easyui-dialog"的问题
当使用MyEclipse新建一个JSP页面的时候,MyEclipse会自动添加一些标记,这些标记也许不一定会在工程中使用到.比如<base href="<%=basePath%& ...
- 使用SVN服务器管理源码
最近在学习使用SVN管理自己的项目文件,正好有好的文章就拿来标记一下,正所谓: 站在巨人的肩膀上 天下知识为我所用 转载两篇关于使用SVN管理源码的文章. 使用SVN进行源码管理(上):http: ...
- java日志,(commons-loging 、log4j 、slf4j 、LogBack介绍)
如果对于commons-loging .log4j .slf4j .LogBack 等都已经非常清楚了,可以忽略本文.几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所 ...
- 转:并查集总结 例题:hdoj 1232 畅通工程
引述之类的就免了,我们现在做题碰到的并查集基础题目大都是连通城市(或者村庄学校),接下来我们就称每一个城市为一个元素.我们解决此类题目运用的是树结构,每个集合用一棵树表示,而树的节点用于存储集合中的元 ...
- [iOS基础控件 - 5.2] 查看大图、缩放图片代码(UIScrollView制作)
原图: 900 x 1305 拖曳滚动: 缩放: 主要代码: // // ViewController.m // ImageZoom // // Created by ...
- Cocos2d-x 重写draw方法绘制直线等图形时被遮挡覆盖问题的一种解决方案
最近在学习过程cocos2dx的过程中需要使用到绘制直线的功能,所以我就采用了引擎中 ccDrawLine 方法,然后重写 draw 方法,在该方法中绘制直线. 但是出现了一个问题,那就是绘制的图形被 ...