用ATL写简单的ActiveX控件 .

简介: 我正在做的项目需要用读卡器来读数据,由于系统是B/S架构的所以只能把读卡器的驱动封装成一个无界面的ActiveX控件,这样web页面中的js代码才能访问读卡器其实做起来也挺简单的,我用的环境是VS2005,步骤如下:打开VS2005后:1、创建一个ATL Project。
我正在做的项目需要用读卡器来读数据,由于系统是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页:
  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"文件中得到
文件最下面会有这样一段:
  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。内容如下:
  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程序打包:
  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控件的电脑上使用这个控件了。
  1. <object id="myactivex" classid="clsid:21EB133E-EF6C-451B-94AA-EB74C3B2ED12" codebase="http://url-to-my-server/myactivex.cab">  
  2. </object>  
目录
相关文章
|
Java C#
C#学习系列相关之多线程(五)----线程池ThreadPool用法
C#学习系列相关之多线程(五)----线程池ThreadPool用法
669 0
|
自然语言处理 Java 索引
Elastic:如何查询特殊字符
某些业务场景下我们需要使用特殊符号来进行查询,但是es的默认分词器以及ik分词器等大多数分词器都会将特殊符号过滤掉,导致后续无法通过特殊符号查询到数据。 那么我们如何来解决这个问题呢,下面列举出几种处理方案
1258 0
|
8月前
|
Web App开发 Linux C#
C# 网页截图全攻略:三种技术与 Chrome 路径查找指南
本文主要介绍了在 C# 中实现网页截图的几种技术及相关要点。涵盖了 PuppeteerSharp、Selenium 和 HtmlToImage 三种方式,分别阐述了它们的安装步骤及核心代码。同时,针对在 C# 中寻找 Windows 上 chrome.exe 路径这一问题,分析了未安装 Google Chrome 和已安装两种情况下的查找原因,并给出了相关参考链接,还列举了一系列与 C# 使用 Selenium、获取 chrome.exe 路径以及在 Linux 上部署相关的参考资料。
280 11
|
9月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
251 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
9月前
|
安全 数据挖掘 BI
代理商级差制分销系统模式开发技术规则
代理商级差制分销系统开发技术规则涵盖系统架构设计、用户角色与权限管理、佣金结算、数据分析、商品分类、激励机制及合规性、技术实现与优化等方面,旨在构建稳定、安全、高效的分销平台,满足多层次代理商管理需求,提升用户体验。
|
Linux 数据安全/隐私保护 Docker
优化Docker权限管理:配置Docker用户组
Docker 利用 Linux 的用户和组权限来管理对 Docker 守护进程的访问权限。一般情况下,只有 root 用户和属于 docker 用户组的用户才被允许访问 Docker 守护进程。在 Linux 系统上使用 Docker 时,如果您尚未配置 docker 用户组,那么作为非 root 用户执行 Docker 相关命令将要求使用 sudo 来提升权限。
1465 2
优化Docker权限管理:配置Docker用户组
|
并行计算 PyTorch Linux
【Deepin 20系统】Linux系统安装Pytorch、Torch
本文提供了在Deepin 20系统中安装PyTorch及其相关库的指南,包括创建conda环境、安装PyTorch及依赖库的步骤。
178 3
|
运维 监控 安全
DevOps实践:从理论到企业级应用的转化之路
【7月更文挑战第21天】在数字化转型的大潮中,DevOps作为一种提升软件开发与运维效率的方法论,正逐步成为企业IT战略的核心。本文将从DevOps的基本概念出发,深入探讨其在企业级应用中的实践路径,包括文化理念转变、工具链的选择与集成、持续交付的实施步骤以及监控与反馈机制的建立。通过分析成功案例,旨在为读者提供一条清晰的DevOps转型路线图,帮助技术团队和运维人员理解并实施DevOps,以实现快速迭代和高效运营的目标。
|
JavaScript
js 解析lrc文件(歌词)
js 解析lrc文件(歌词)
214 1