用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] view plaincopyprint?

  1. <html>  
  2. <body>  
  3. <script type="text/javascript" >  
  4. function doTest() {  
  5. var ret=test.myTestMethod();  
  6. alert(ret);  
  7. }  
  8. </script>  
  9. <object id="test" classid="clsid:21EB133E-EF6C-451B-94AA-EB74C3B2ED12" >  
  10. </object>  
  11. <button onclick="doTest();">lala</button>  
  12. </body>  
<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"文件中得到。
文件最下面会有这样一段:

[html] view plaincopyprint?

  1. library MyActiveXProjectLib  
  2. {  
  3. importlib("stdole2.tlb");  
  4. [  
  5. uuid(21EB133E-EF6C-451B-94AA-EB74C3B2ED12),  
  6. helpstring("MyActiveX Class")  
  7. ]  
  8. coclass CMyActiveX  
  9. {  
  10. [default] interface IMyActiveX;  
  11. };  
  12. };  
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。内容如下:

[plain] view plaincopyprint?

  1. [version]   
  2. signature="$CHINA$"   
  3. AdvancedINF=2.0   
  4.   
  5. [Add.Code]   
  6. atl71.dll = atl71.dll   
  7. CardReader.dll = CardReader.dll  
  8.   
  9. [atl71.dll]   
  10. file-win32-x86=thiscab   
  11. FileVersion=7,10,3077,0   
  12. DestDir=11   
  13. RegisterServer=yes   
  14.   
  15. [CardReader.dll]   
  16. file-win32-x86=thiscab   
  17. clsid={21EB133E-EF6C-451B-94AA-EB74C3B2ED12}  
  18. FileVersion=1,0,0,1  
  19. RegisterServer=yes   
[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文件的具体格式可以参考我的另一篇文章:http://blog.csdn.net/chenyujing1234/article/details/7668570

这里要说明的是,在inf文件中必须包含控件用到的所有dll文件;然后用cabarc程序打包:

[plain] view plaincopyprint?

  1. cabacr -s 6144 N myactivex.cab atl71.dll CardReader.dll myactivex.inf  
cabacr -s 6144 N myactivex.cab atl71.dll CardReader.dll myactivex.inf

签名的问题我还没完全搞定,搞定再说吧。
最后在网页中加入下面的代码,就可以在没有注册此ActiveX控件的电脑上使用这个控件了。

[html] view plaincopyprint?

  1. <object id="myactivex" classid="clsid:21EB133E-EF6C-451B-94AA-EB74C3B2ED12" codebase="http://url-to-my-server/myactivex.cab">  
  2. </object>  
时间: 2024-11-03 22:39:49

用ATL写简单的ActiveX控件 .的相关文章

用ATL开发和部署ActiveX控件的简单例子

写一个ATL组件,加一个简单类,在类头文件中加入:BEGIN_CATEGORY_MAP(CAirlineInfo) IMPLEMENTED_CATEGORY(CATID_SafeForScripting) IMPLEMENTED_CATEGORY(CATID_SafeForInitializing) END_CATEGORY_MAP() 然后把上面代码需要的头文件(#include <objsafe.h> )引入到stdafx.h.再在类中随便加入一个方法调用WinExec()函数就ok了,看

visual studio 2010-VS2010使用ATL开发的ActiveX控件没有显示固定属性页,用VC6的则可以

问题描述 VS2010使用ATL开发的ActiveX控件没有显示固定属性页,用VC6的则可以 不知道为何,用VC6的ATL向导生成的Activex控件在ActiveX Control Test Container工具中测试时,是可以看到固定属性页的,用VS2010生成的就看不到了,只能看到一个Extended,想请教一下各位,若能解惑,在下不胜感激~ 解决方案 参考:https://msdn.microsoft.com/en-us/library/3dc9xhf3.aspx

activex-C#开发ActiveX控件调用dll文件时,dll文件放在什么位置,我的出错了

问题描述 C#开发ActiveX控件调用dll文件时,dll文件放在什么位置,我的出错了 通过c#谢了一个很简单的Activex控件,调用dll文件(dll文件是c++写的,并且dll文件不是com组件),在普通的容器中调用动态库都没问题,但是通过activex时就会出错,请问这是问什么,请留言,也可以加我qq:574225218 解决方案 在dll文件中调用VBA的命令 解决方案二: 是在IE中测试出错么?尝试把浏览器的安全等级设置全部调到最低,在客户端安装.net framework并且运行

用ATL和MFC来创建ActiveX控件

摘要目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发.MFC代表了创建独立的Windows应用的一种简单.一致的方法:ATL提供了一种框架来实现创建COM客户机和服务器所必须的样板文件代码.这两种框架在它们对于开发ActiveX的用途上会合了.我们将看看这两种框架是如何适用于创建ActiveX控件的--突出其优缺点,亲自经历创建一个控件的过程--以便你能够决定何时使用一种框架,何时使用另一种. 如果你希望用C++来写ActiveX控件,有两个流行的框架,一个是Micr

C#写Activex控件给DELPHI使用时,如果加上事件??

问题描述 需要用C#编写Activex控件,并且在DELPHI6.0环境下使用,ACTIVEX控件的方法在DELPHI中已经可以调用,但是在DELPHI的那个OBJECTINSPECTOR中一直没有显示C#activex里定义的事件,但是项目是需要事件触发的,没辙了...哪位高手写过的给个完整例子可以么?或者详细讲解一下?不胜感谢!! 解决方案 解决方案二:没人理是不是太简单了啊,自己顶一下解决方案三:DELPHI没搞过,,没人不是因为太简单了,,太简单了会有很多人回复的,,要么就是问题太难,要

如何用ATL创建ActiveX控件

演示截图: 代码简介或代码解析:        如何用ATL创建ActiveX控件 实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部单击将会使多边形的边数在当前的基础上-1,并能改变多边形的颜色.最后举了两个例子说明了如何使用这个刚刚生产得控件.一个是把该控件应用到网页中,一个则是用于一个基于对话框的程序中.详细代码请下载压缩包. (一) 创建工程 (1) 打开VC6集成开发环境,按新建按钮,选择PROJECT标签

MFC ActiveX控件与ATL ActiveX控件的比较 .

1.两者均可使用VS IDE中AppWizard来建立框架,前者使用"MFC ActiveX Control Wizard",后者使用"ATL COM AppWizard". 2.用MFC建立的ActiveX控件的扩展名缺省为".ocx":用ATL(活动模板库)建立的扩展名缺省为".dll". 3.用MFC建立ActiveX控件要简单得多,原因是MFC省去聊很多低级的COM概念,且控件设计中可使用多种MFC类,如CString

写一个简单的登陆控件

控件 login.ascx 由于在页面上很频繁使用登陆,把它做成一个控件是很有必要的,下面就是我写的一个简单的登陆控件,大家可以根据的需要完善一下. <%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.Oledb" %><script language="VB" runat="server">Sub P

VC写的ActiveX控件能不能被ASP.NET引用

active|activex|asp.net|控件   1.尊敬的合作伙伴:您好!   非常感谢您使用微软新闻组技术支持!关于您提到的ASP.NET无法引用VC写的控件的问题,我想请问您是想在服务器端引用VC控件中的一些功能,还是VC写了一个ActiveX的控件而无法在网页中使用.请您能否详细描述一下您目前遇到的错误.或者是您引用VC控件时遇到的具体错误信息,这样以方便我们能够更好的来帮助您解决问题,谢谢! 2.关于您提到C#与VC写的ActiveX控件进行交互的问题,从您的描述来看,根据我的理