用ATL写简单的ActiveX控件
来源:互联网 发布:洛阳理工学院网络教育 编辑:程序博客网 时间:2024/05/22 07:07
用ATL写简单的ActiveX控件-vs2005
分类: COM/ATL2008-02-15 10:28
用ATL写简单的ActiveX控件
我正在做的项目需要用读卡器来读数据,由于系统是B/S架构的
所以只能把读卡器的驱动封装成一个无界面的ActiveX控件,这样web页面中的js代码才能访问读卡器
其实做起来也挺简单的,我用的环境是VS2005,步骤如下。
打开VS2005后:
1。创建一个ATL Project。Application Setting选择为:
Server-Type:Dynamic-Link Library (dll)
Additional-Options: Allow merging of proxy/stub code
这里说一句,对于所有只用于web的activex控件,不管有没有界面,都应该用这两个选项。
2。选择菜单“Project->Add Class..”,创建控件类。因为这里要建的是无界面的ActiveX控件,所以选择
使用的Class Template为“ATL Simple Object”。之后填写类名,这里假设为“MyActiveX”。之后的Option选择为:
Threading Model: single (对于所有只用于web的ActiveX控件来说,这个选项够了)
Interface: Dual
Aggregration: none (我这个类不需要别的COM组件聚合,所以none足够了)
如果需要增加事件支持(类似于DOM中的Event)的话,还应该把Connection Points选上。我这里不需要这个,所以就不选了。
最后点击“finish”按钮完成创建。
3。增加method和property定义。直接在Class View视图上右键单击接口IMyActiveX,会弹出一个上下文菜单,通过里面的"ADD->Add Method..."和"ADD->Add Property.."
菜单项即可自动生成method或者property定义。然后直接写实现代码即可。
注意:最好先搞清楚in/out/retval等参数类型以及BSTR/VARIANT等变量类型的作用和使用方法后再开始写代码。否则很容易出现各种问题。
4。编写完代码并编译成dll之后,用regsvr32注册生成的dll。
然后写测试html页:
<html>
<body>
<script type="text/javascript" >
function doTest() {
var ret=test.myTestMethod();
alert(ret);
}
</script>
<object id="test" classid="clsid:21EB133E-EF6C-451B-94AA-EB74C3B2ED12" >
</object>
<button onclick="doTest();">lala</button>
</body>
用ie打开测试页就可以测试我们的ActiveX类了。
注意:页面里面定义object时需要一个classid。这个classid可以从工程中的"工程名.idl"文件中得到。
文件最下面会有这样一段:
library MyActiveXProjectLib
{
importlib("stdole2.tlb");
[
uuid(21EB133E-EF6C-451B-94AA-EB74C3B2ED12),
helpstring("MyActiveX Class")
]
coclass CMyActiveX
{
[default] interface IMyActiveX;
};
};
这里面的uuid(21EB133E-EF6C-451B-94AA-EB74C3B2ED12)就是我们要的classid。
5。测试完毕之后就是打包了。首先要写包的inf文件。假设文件名为myactivex.inf。内容如下:
[version]
signature="$CHINA$"
AdvancedINF=2.0
[Add.Code]
atl71.dll = atl71.dll
CardReader.dll = CardReader.dll
[atl71.dll]
file-win32-x86=thiscab
FileVersion=7,10,3077,0
DestDir=11
RegisterServer=yes
[CardReader.dll]
file-win32-x86=thiscab
clsid={21EB133E-EF6C-451B-94AA-EB74C3B2ED12}
FileVersion=1,0,0,1
RegisterServer=yes
inf文件的具体格式可以参考相关文档。这里要说明的是,在inf文件中必须包含控件用到的所有dll文件。
然后用cabarc程序打包:
cabacr -s 6144 N myactivex.cab atl71.dll CardReader.dll myactivex.inf
签名的问题我还没完全搞定,搞定再说吧。
最后在网页中加入下面的代码,就可以使用这个控件了。
<object id="myactivex" classid="clsid:21EB133E-EF6C-451B-94AA-EB74C3B2ED12" codebase="http://url-to-my-server/myactivex.cab">
</object>
所以只能把读卡器的驱动封装成一个无界面的ActiveX控件,这样web页面中的js代码才能访问读卡器
其实做起来也挺简单的,我用的环境是VS2005,步骤如下。
打开VS2005后:
1。创建一个ATL Project。Application Setting选择为:
Server-Type:Dynamic-Link Library (dll)
Additional-Options: Allow merging of proxy/stub code
这里说一句,对于所有只用于web的activex控件,不管有没有界面,都应该用这两个选项。
2。选择菜单“Project->Add Class..”,创建控件类。因为这里要建的是无界面的ActiveX控件,所以选择
使用的Class Template为“ATL Simple Object”。之后填写类名,这里假设为“MyActiveX”。之后的Option选择为:
Threading Model: single (对于所有只用于web的ActiveX控件来说,这个选项够了)
Interface: Dual
Aggregration: none (我这个类不需要别的COM组件聚合,所以none足够了)
如果需要增加事件支持(类似于DOM中的Event)的话,还应该把Connection Points选上。我这里不需要这个,所以就不选了。
最后点击“finish”按钮完成创建。
3。增加method和property定义。直接在Class View视图上右键单击接口IMyActiveX,会弹出一个上下文菜单,通过里面的"ADD->Add Method..."和"ADD->Add Property.."
菜单项即可自动生成method或者property定义。然后直接写实现代码即可。
注意:最好先搞清楚in/out/retval等参数类型以及BSTR/VARIANT等变量类型的作用和使用方法后再开始写代码。否则很容易出现各种问题。
4。编写完代码并编译成dll之后,用regsvr32注册生成的dll。
然后写测试html页:
<html>
<body>
<script type="text/javascript" >
function doTest() {
var ret=test.myTestMethod();
alert(ret);
}
</script>
<object id="test" classid="clsid:21EB133E-EF6C-451B-94AA-EB74C3B2ED12" >
</object>
<button onclick="doTest();">lala</button>
</body>
用ie打开测试页就可以测试我们的ActiveX类了。
注意:页面里面定义object时需要一个classid。这个classid可以从工程中的"工程名.idl"文件中得到。
文件最下面会有这样一段:
library MyActiveXProjectLib
{
importlib("stdole2.tlb");
[
uuid(21EB133E-EF6C-451B-94AA-EB74C3B2ED12),
helpstring("MyActiveX Class")
]
coclass CMyActiveX
{
[default] interface IMyActiveX;
};
};
这里面的uuid(21EB133E-EF6C-451B-94AA-EB74C3B2ED12)就是我们要的classid。
5。测试完毕之后就是打包了。首先要写包的inf文件。假设文件名为myactivex.inf。内容如下:
[version]
signature="$CHINA$"
AdvancedINF=2.0
[Add.Code]
atl71.dll = atl71.dll
CardReader.dll = CardReader.dll
[atl71.dll]
file-win32-x86=thiscab
FileVersion=7,10,3077,0
DestDir=11
RegisterServer=yes
[CardReader.dll]
file-win32-x86=thiscab
clsid={21EB133E-EF6C-451B-94AA-EB74C3B2ED12}
FileVersion=1,0,0,1
RegisterServer=yes
inf文件的具体格式可以参考相关文档。这里要说明的是,在inf文件中必须包含控件用到的所有dll文件。
然后用cabarc程序打包:
cabacr -s 6144 N myactivex.cab atl71.dll CardReader.dll myactivex.inf
签名的问题我还没完全搞定,搞定再说吧。
最后在网页中加入下面的代码,就可以使用这个控件了。
<object id="myactivex" classid="clsid:21EB133E-EF6C-451B-94AA-EB74C3B2ED12" codebase="http://url-to-my-server/myactivex.cab">
</object>
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<TITLE>内嵌Activex的Activex插件测试页</TITLE>
</HEAD>
<BODY>
<OBJECT ID="Hello" CLASSID="CLSID:CD66BF44-CCBC-4175-BB55-10E14AAFCC17" width=700 height=400 ></OBJECT>
<input type=button value="Hello" onclick="Hello()">
<script language="javascript" type="text/javascript">
function play()
{
var obj;
var palyobj = document.getElementById("Hello");
palyobj.Hello();
}
<script>
</BODY>
</HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<TITLE>内嵌Activex的Activex插件测试页</TITLE>
</HEAD>
<BODY>
<OBJECT ID="Hello" CLASSID="CLSID:CD66BF44-CCBC-4175-BB55-10E14AAFCC17" width=700 height=400 ></OBJECT>
<input type=button value="Hello" onclick="Hello()">
<script language="javascript" type="text/javascript">
function play()
{
var obj;
var palyobj = document.getElementById("Hello");
palyobj.Hello();
}
<script>
</BODY>
</HTML>
- 用ATL写简单的ActiveX控件
- 用ATL写简单的ActiveX控件
- ATL写ActiveX的注意事项
- 用VS2008+ATL开发Gif的ActiveX控件的步骤
- 用ATL和MFC来创建ActiveX控件的比较
- MFC ActiveX控件与ATL ActiveX控件的比较
- MFC ActiveX控件与ATL ActiveX控件的比较
- MFC ActiveX控件与ATL ActiveX控件的比较 .
- 基于GDI+的gif ActiveX控件(ATL)
- 使用ATL建立ActiveX控件的学习体会
- 用ATL开发ActiveX网页控件
- 编写 ATL ActiveX 控件
- ActiveX控件(ATL篇)
- 基于ATL开发ActiveX控件(第一节,简单的Hello world)
- 基于ATL开发ActiveX控件(第一节,简单的Hello world)
- 简单介绍 VC2003 使用 ATL 开发 ActiveX 控件
- 使用ATL创建简单ActiveX控件(一) —— 创建ATL项目
- ATL建立ActiveX控件(一)
- Redis实战《红丸出品》1.2 为什么选择Key-Value Store
- 实现对象的复用——享元模式(四)
- POJ 1182 食物链
- 醉酒驾车
- Objective-C id类型实现原理
- 用ATL写简单的ActiveX控件
- 小细节
- Redis实战《红丸出品》1.3 初识Redis
- 汽车雨刷器的保养细则
- 汽车雨刷器的保养细则
- Redis实战《红丸出品》1.4 快速入门
- Redis实战《红丸出品》2.1 Redis数据类型及操作前言
- 教你如何制作exe电子书
- Oracle数据库权限管理