ActiveX控件的开发

 先引一篇例文:http://zxjgoodboy.blog.sohu.com/79171947.html

用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 οnclick="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>
---------------------------------------------------------------------------------------------------------------------------------------------
例文到此结束,我仅将我按照上面的方法所遇到的问题,做个汇总。
1、ATL项目的创建
      1.1 按例文一步一步可以创建一个ATL项目,最后参数in/out/retval,形如Foo(int i,int j,int* returnval),前两个是
传入参数,后一个是返回值,所以添加参数前两个【in】,最后一个【out,retval】,如果添加错误,也可以直接修改
项目中的代码,不过至少要修改3处。
      1.2 还有在ATL项目中不能应用CString类,只要在stdafx.h中添加#include <atlstr.h>即可。
2、CAB文件的打包
      2.1 动态库不用注册,只是拷贝到客户端的SYSTEM32目录下
           ;假如案例中atl71.dll不用注册,如果atl71.dll是一个COM组件,即ATL调用COM组件,此处一定要注册。
             [atl71.dll] 
            file-win32-x86=thiscab 
            FileVersion=7,10,3077,0 
            DestDir=11 
            RegisterServer=no
      2.2 要引用的动态库没有版本号
            直接把FileVersion这一节删掉就可以了。
      2.3 inf格式解释
            "thiscab" 是一个关键字,指包含该INF的CAB文件。也可以从网上下载所需要的DLL文件,只要指定一个HTTP网址即    可,如: file-win32-x86= http://www.chengdujob.net/activex/DeanUSBKey.DLL 
             关键字"file-win32-x86"指定平台是x86。
            "FileVersion"文件版本号。
            "DestDir"指的是装载目录或者文件的地址: 11指系统目录 WINDOWS/SYSTEM32;10 指Windows 目录。
3、ATL调用COM组件
       和例文篇的作者一样,我也是对读卡器进行开发的,不过厂家提供的了一个COM组件,所以要在自己的项目里
       添加调用注册好的COM组件,我用的开发环境是VC++ 2005.NET。直接通过引用,将COM组件引进到项目中,
       厂家的DLL也被转换到CLW的DLL, 项目中可以正常调用这个组件,不过最后不能读出卡号,后来不得不通过
       CoCreateInstance()这个函数调用才得到卡号,不知道什么原因,尚未得到很好的解释,望高人指点。
4、ACTIVEX控件不能下载,被IE拒绝
        将访问的网站添加成信任站点,并将信任站点的自定义级别中的Activex控件全部启用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值