我正在做的项目需要用读卡器来读数据,由于系统是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. [Add.Code]
  5. atl71.dll = atl71.dll
  6. CardReader.dll = CardReader.dll
  7. [atl71.dll]
  8. file-win32-x86=thiscab
  9. FileVersion=7,10,3077,0
  10. DestDir=11
  11. RegisterServer=yes
  12. [CardReader.dll]
  13. file-win32-x86=thiscab
  14. clsid={21EB133E-EF6C-451B-94AA-EB74C3B2ED12}
  15. FileVersion=1,0,0,1
  16. 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>

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

  1. 【VS开发】 自己编写一个简单的ActiveX控件——详尽教程

    最近开始学ActiveX控件编程,上手不太容易,上网想找相关教程也没合适的,最后还是在师哥的指导下完成了第一个简单控件的开发,现在把开发过程贴出来与大家分享一下~ (环境说明--平台:vs2005:语 ...

  2. 最全的基于MFC的ActiveX控件开发教程

    浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ...

  3. 用ATL和MFC来创建ActiveX控件

    摘要:目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发.MFC代表了创建独立的Windows应用的一种简单.一致的方法:ATL提供了一种框架来实现创建COM客户机和服务器所 ...

  4. Win32编程点滴3 - 简单ActiveX控件的使用

    虽然这里一片的.net气氛,到处充斥着像MVC.WPF.WorkFlow.LINQ等各种niubility的术语.但我们使用的Windows还是由COM技术主宰着:我们在选择日常使用的软件时,也会避免 ...

  5. 如何用ATL创建ActiveX控件

    演示截图: 代码简介或代码解析: 如何用ATL创建ActiveX控件 实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部 ...

  6. 调用ocx ActiveX控件详解(做一个简单的ocx控件)

    背景 最近做的项目都和插件有关,就是在页面中调用插件的方法,然后进行操作. 插件就是ocx ActiveX控件,具体的说明可以自己去了解一下,在这里就不做赘述. 具体调用方式很简单: 1.在页面中写一 ...

  7. ATL开发 ActiveX控件的 inf文件模板

    ATL开发 ActiveX控件的 inf文件模板    

  8. ActiveX控件(ATL篇)

    目录 第1章 VC++6.0创建    2 1.1 目标    2 1.2 创建项目    2 1.3 增加COM类    4 1.4 属性    7 1.5 事件    8 1.6 实现连接点    ...

  9. ATL控件签名之后页面还提示“在此页面上的Activex控件和本页上的其他部分及交互可能不安全”

    ATL控件正常签名打包,然后安装之后还是会提示: 没理由啊,签名是花钱搞得正当的签名.后来查了资料才知道这还不够,需要在创建ATL控件的时候继承一个IObjectSafetyImpl 类 知道了原因, ...

随机推荐

  1. js中的typeof

    typeof的几种返回结果的分类: 转自:http://www.360doc.com/content/14/0718/15/8790037_395279403.shtml typeof运算符介 绍:t ...

  2. php随笔9-thinkphp OA系统 集成UEditor

    版本信息:thinkphp 3.1.3 full     UEditor 1.4.3.1 utf8-php 1.将EUditor放在项目public目录下. 2.在指定页面加载编辑器 <!-- ...

  3. Non recursive Depth first search

    深度优先非递归实现算法: 1 递归算法: //初始化相关数据结构 DFS(G) ------------------------------------------------------------ ...

  4. 微软http api说明书地址

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa364622(v=vs.85).aspx https://msdn.microso ...

  5. Windows Phone 8初学者开发—第2部分:安装Windows Phone SDK 8.0

    原文 Windows Phone 8初学者开发—第2部分:安装Windows Phone SDK 8.0 原文地址:http://channel9.msdn.com/Series/Windows-Ph ...

  6. 基于visual Studio2013解决C语言竞赛题之0306分数转换

      题目 解决代码及点评 根据题目要去,我们可以通过if实现该功能,伪代码如下: if(a > 90) print 'A' else if(a>80) print 'b' else ...

  7. linux常用命令加实例大全

    目  录引言    1一.安装和登录    2(一)    login    2(二)    shutdown    2(三)    halt    3(四)    reboot    3(五)    ...

  8. 解决安装oracle后系统变慢问题

    Oracle数据库是一个很占资源的软件,光一个实例服务所占内存,根据其安装时分配的内存就至少要达到256MB以上,再加上其他附属服务,光内存就要占用物理内存的400M左右,虚拟内存也会有等值或更高的损 ...

  9. SeekBar 样式设置

    1 SeekBar简介 SeekBar是进度条.我们使用进度条时,可以使用系统默认的进度条:也可以自定义进度条的图片和滑块图片等. 2 SeekBar示例 创建一个activity,包含2个SeekB ...

  10. Codeforces Round #262 (Div. 2) 460C. Present(二分)

    题目链接:http://codeforces.com/problemset/problem/460/C C. Present time limit per test 2 seconds memory ...