我正在做的项目需要用读卡器来读数据,由于系统是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. spoj 3871 gcd extreme

    题目大意给出一个n,求sum(gcd(i,j),<i<j<=n); 可以明显的看出来s[n]=s[n-]+f[n]; f[n]=sum(gcd(i,n),<i<n); 现 ...

  2. U-Boot在FL2440上移植(一)----修改系统时钟

    <一>U-boot源码结构 图片来自韦东山的<嵌入式linux应用开发完全手册> U-boot下载地址:ftp://ftp.denx.de/pub/u-boot/ 交叉编译工具 ...

  3. [置顶] android网络通讯之HttpClient4不指定参数名发送Post

    在HttpClient4之前都是通过List<NameValuePair>键值对的形式来向服务器传递参数 ,在4.0版本中在加入了不指定参数名发送数据的形式,利用StringEntity来 ...

  4. Linux 各类软件整理汇总

    关于前端和后端的解释 详细链接见:http://wiki.ubuntu.org.cn/Qref/Apps Linux下程序通常不需要作为一个整体,而是模块化,于是有了可选的前端和后端——这种情况下:前 ...

  5. 用 PS 调整服务器时间

    用 PS 调整服务器时间 Powershell 有一个命令用来调整计算机的时间, Set-Date -Adjust,但是,只能调整本地时间,不能调整远程的计算机时间. function AdjustD ...

  6. iOS中正确的截屏姿势

    昨天写了个用到截屏功能的插件,结果问题不断,今天终于解决好了,把debug过程中所有尝试过的截屏方法都贴出来吧- 第一种 这是iOS 3时代开始就被使用的方法,它被废止于iOS 7.iOS的私有方法, ...

  7. c# datagridviewcomboboxcell值无效的解决办法

    一直认为是数据库存储的数据和datagridviewcomboboxcell对不上导致,今天碰到两者对应上了,预览的时候还是提示错误, 查看了下网上其他大神的解决方法,是数据库字段类型有误,查看了下, ...

  8. ThinkPHP - 自动创建 + 自动验证 + 自动完成

    自动创建:创建数据模型. $User->create(); 自动验证:验证提交的表单数据. protected $_validate = array( array('verify','requi ...

  9. java读取远程url图片,得到宽高

    链接地址:http://blog.sina.com.cn/s/blog_407a68fc0100nrb6.html import java.io.IOException;import java.awt ...

  10. js window.onload事件

    1.最简单的调用方式 直接写到html的body标签里面,如: ? 1 2 3 4     <html>       <body onload="func()"& ...