用ATL寫簡單的ActiveX控件 .
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
我正在做的項目需要用讀卡器來讀數據,由于系統是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] view plaincopyprint?
用ie打開測試頁就可以測試我們的ActiveX類了。
注意:頁面里面定義object時需要一個classid。這個classid可以從工程中的"工程名.idl"文件中得到。
文件最下面會有這樣一段: [html] view plaincopyprint?
這里面的uuid(21EB133E-EF6C-451B-94AA-EB74C3B2ED12)就是我們要的classid。
5。測試完畢之后就是打包了。 首先要寫包的inf文件。假設文件名為myactivex.inf。內容如下:
[plain] view plaincopyprint?
[plain] view plaincopyprint?
簽名的問題我還沒完全搞定,搞定再說吧。
最后在網頁中加入下面的代碼,就可以在沒有注冊此ActiveX控件的電腦上使用這個控件了。
[html] view plaincopyprint?
所以只能把讀卡器的驅動封裝成一個無界面的ActiveX控件,這樣web頁面中的js代碼才能訪問讀卡器
其實做起來也挺簡單的,我用的環境是VS2005,步驟如下:
打開VS2005后:
1、創建一個ATL Project。

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] view plaincopyprint?
- <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"文件中得到。
文件最下面會有這樣一段: [html] view plaincopyprint?
- 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。內容如下:
[plain] view plaincopyprint?
- [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
[plain] view plaincopyprint?
- cabacr -s 6144 N myactivex.cab atl71.dll CardReader.dll myactivex.inf
簽名的問題我還沒完全搞定,搞定再說吧。
最后在網頁中加入下面的代碼,就可以在沒有注冊此ActiveX控件的電腦上使用這個控件了。
[html] view plaincopyprint?
- <object id="myactivex" classid="clsid:21EB133E-EF6C-451B-94AA-EB74C3B2ED12" codebase="http://url-to-my-server/myactivex.cab">
- </object>