zoukankan      html  css  js  c++  java
  • 用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页:
    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>  

    用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. };  

    这里面的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   
    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  

    签名的问题我还没完全搞定,搞定再说吧。
    最后在网页中加入下面的代码,就可以在没有注册此ActiveX控件的电脑上使用这个控件了。
    1. <object id="myactivex" classid="clsid:21EB133E-EF6C-451B-94AA-EB74C3B2ED12" codebase="http://url-to-my-server/myactivex.cab">  
    2. </object>  
  • 相关阅读:
    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
    利用Docker构建开发环境
    MyEclipse 8.6.1 制作绿色版
    Tomcat,JBoss与JBoss Web
    oracle,mysql,SqlServer三种数据库的分页查询
    Tomcat+JSP经典配置实例
    [转载]JDK自带的实用工具——native2ascii.exe
    用sql删除数据库重复的数据的方法
    Dom4j 使用简介(全而好的文章)
    Java操作XML文件 dom4j 篇
  • 原文地址:https://www.cnblogs.com/lidabo/p/3483132.html
Copyright © 2011-2022 走看看