由於要在Web項目中采用RFID讀取功能,所以有必要開發Activex,一般情況下開發Activex都采用VC,VB等,但對這兩塊不是很熟悉,所以采用C#編寫Activex的方式實現。
本文方法參考網絡
1.編寫WindowsFromControls
2.發布WindowsFormControls為Activex
3.在web中使用該Activex
首先編寫Windows控件
如何編寫不再詳述(注意一個地方,GUID自己用vs工具生成一個,下面會用到。我的0CBD6597-3953-4B88-8C9F-F58B1B023413)
重要的類:
- using System;
- using System.Runtime.InteropServices;
- namespace RFIDReader
- {
- public class ReadRfid
- {
- [DllImport("MasterRD.dll")]
- private static extern int rf_init_com(int port, int baud);
- [DllImport("MasterRD.dll")]
- private static extern int rf_request(short icdev, byte model, ref short TagType);
- [DllImport("MasterRD.dll")]
- private static extern int rf_write(int icdev, char _Adr, char _Data);
- [DllImport("MasterRD.dll")]
- private static extern int rf_anticoll(short icdev, byte bcnt, ref byte PPSnr, ref byte pRLength);
- [DllImport("MasterRD.dll")]
- private static extern int rf_ClosePort();
- public string CardNum
- {
- get { return getCardNum(); }
- }
- private string getCardNum()
- {
- int post = 4; //調用COM1口
- int baud = 9600;
- int i = -1;
- byte model = 82;
- byte b1 = 4;
- short TagType = 4;
- byte[] buf1 = new byte[200];
- try
- {
- rf_init_com(post, baud);
- rf_request(0, model, ref TagType);
- rf_anticoll(0, 4, ref buf1[0], ref b1);
- string s1 = "";
- for (i = 0; i < b1; i++)
- {
- s1 = s1 + System.Convert.ToString(long.Parse(buf1[i].ToString()), 16).ToUpper();
- }
- rf_ClosePort();
- if (s1 == "0000")
- { throw (new Exception()); }
- return s1;
- }
- catch (Exception)
- {
- }
- return "";
- }
- }
- }
vIEw sourceprint?
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Runtime.InteropServices;
- namespace RFIDReader
- {
- [ComImport, GuidAttribute("<SPAN style="COLOR: #800000">0CBD6597-3953-4B88-8C9F-F58B1B023413</SPAN>
- <SPAN style="COLOR: #800000"> </SPAN>")]
- [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
- public interface IObjectSafety
- {
- [PreserveSig]
- void GetInterfacceSafyOptions(
- int riid,
- out int pdwSupportedOptions,
- out int pdwEnabledOptions);
- [PreserveSig]
- void SetInterfaceSafetyOptions(
- int riid,
- int dwOptionsSetMask,
- int dwEnabledOptions);
- }
- }
- using System;using System.Collections.Generic;using System.ComponentModel;
- using System.Drawing;
- using System.Data;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Runtime.InteropServices;
- using CJ;
- namespace RFIDReader{
- [Guid("0CBD6597-3953-4B88-8C9F-F58B1B023413"), ProgId("RFIDReader.Reader"), ComVisible(true)]
- public partial class Reader : UserControl,IObjectSafety
- {
- public Reader()
- {
- InitializeComponent();
- }
- #region IObjectSafety 成員
- public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
- {
- pdwSupportedOptions = 1;
- pdwEnabledOptions = 2;
- }
- public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
- {
- throw new NotImplementedException();
- }
- #endregion
- private void timer1_Tick(object sender, EventArgs e)
- {
- ReadRfid rfid=new ReadRfid();
- string str = rfid.CardNum;
- if (str != "")
- {
- textBox1.Text = str; GetInfo();
- }
- }
- public int TimerSpan
- {
- get { return timer1.Interval; }
- set { timer1.Interval = value; }
- } public string CardNum
- {
- get { return textBox1.Text; }
- }
- private void GetInfo()
- {
- this.label1.Text = "cccc";
- } }}
為了能夠在所有客戶端IE上顯示控件,要在程序的AssemblyInfo.cs裡添加如下語句
- [assembly: AllowPartiallyTrustedCallers()]
下一步,右鍵該項目,屬性,生成,將為com互操作注冊,打上勾勾
然後編譯,如果沒有問題,那麼測試下,應該可以讀取RFID的ID到文本框了。
2.制作安裝程序
跟普通的制作安裝程序一樣,新建一個安裝程序,然後刪掉裡面的文件夾。
鼠標右鍵空白區域-》添加-》項目輸出--》選擇主輸出
這樣即可生成安裝包了。
到現在其實已經可以用了,但為了方便我們可以進一步生成cab包。
下載CABARC.exe。解壓縮,到bin目錄中執行如下doc命令
cabarc n 生成的cab名.cab 安裝文件.msi install.inf
install.inf內容如下:
- [version]
- signature="$CHICAGO$"
- AdvancedINF=2.0
- [Setup Hooks]
- hook1hook1=hook1
- [hook1]
- run=msIExec.exe /i "%EXTRACT_DIR%\ReaderInstaller.msi" /qn
修改稱自己的安裝文件即可
3.在web中使用。
新建一個web項目,在default.ASPx中輸入一下代碼即可使用
- <object id="RFIDReader" classid="clsid:0CBD6597-3953-4B88-8C9F-F58B1B023413"
- codebase="RFID/RFIDREADER.cab">
- </object>
這裡的clsid就是自己生成的GUID編號
這裡的RFID使用的是MasterRD.dll和CFCom.dll不同產品使用可能不同,同時注意RFID的COM端口號,本例為測試例子,所以寫死了COM口,客戶端IE浏覽時,需要將RFID的端口改成對應的。
注意:如果發布到服務器上,客戶端ie上無法顯示控件,那麼請將訪問地址添加到IE的受信任站點,如果不能安裝cab那麼只能用戶自己安裝Activex了。
原文鏈接:http://www.cnblogs.com/qidian10/archive/2011/04/06/2006976.Html
【編輯推薦】