本文介绍了在C#中使用Activex实现Web客户端读取RFID功能。
由于要在Web项目中采用RFID读取功能,所以有必要开发Activex,一般情况下开发Activex都采用VC,VB等,而本文采用C#编写Activex的方式实现。
本文方法参考网络
1.编写WindowsFromControls
2.发布WindowsFormControls为Activex
3.在web中使用该Activex
1、编写windows控件
如何编写不再详述(注意一个地方,GUID自己用vs工具生成一个,下面会用到。我的0CBD6597-3953-4B88-8C9F-F58B1B023413)
重要的类:
usingSystem;usingSystem.Runtime.InteropServices;namespaceRFIDReader{publicclassReadRfid{[DllImport("MasterRD.dll")]privatestaticexternintrf_init_com(intport,intbaud);[DllImport("MasterRD.dll")]privatestaticexternintrf_request(shorticdev,bytemodel,refshortTagType);[DllImport("MasterRD.dll")]privatestaticexternintrf_write(inticdev,char_Adr,char_Data);[DllImport("MasterRD.dll")]privatestaticexternintrf_anticoll(shorticdev,bytebcnt,refbyteppsnr,refbytepRLength);[DllImport("MasterRD.dll")]privatestaticexternintrf_ClosePort();publicstringCardNum{get{returngetCardNum();}}privatestringgetCardNum(){intpost=4;//调用COM1口intbaud=9600;inti=-1;bytemodel=82;byteb1=4;shortTagType=4;byte[]buf1=newbyte[200];try{rf_init_com(post,baud);rf_request(0,model,refTagType);rf_anticoll(0,4,refbuf1[0],refb1);strings1="";for(i=0;i<b1;i++){s1=s1+System.Convert.ToString(long.Parse(buf1[i].ToString()),16).ToUpper();}rf_ClosePort();if(s1=="0000"){throw(newException());}returns1;}catch(Exception){}return"";}}}view sourceprint?
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.InteropServices;namespaceRFIDReader{[ComImport,GuidAttribute("<SPANstyle="COLOR:#800000">0CBD6597-3953-4B88-8C9F-F58B1B023413</SPAN><SPANstyle="COLOR:#800000"></SPAN>")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]publicinterfaceIObjectSafety{[PreserveSig]voidGetInterfacceSafyOptions(intriid,outintpdwSupportedOptions,outintpdwEnabledOptions);[PreserveSig]voidSetInterfaceSafetyOptions(intriid,intdwOptionsSetMask,intdwEnabledOptions);}}usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Drawing;usingSystem.Data;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingCJ;namespaceRFIDReader{[Guid("0CBD6597-3953-4B88-8C9F-F58B1B023413"),ProgId("RFIDReader.Reader"),ComVisible(true)]publicpartialclassReader:UserControl,IObjectSafety{publicReader(){InitializeComponent();}#regionIObjectSafety成员publicvoidGetInterfacceSafyOptions(intriid,outintpdwSupportedOptions,outintpdwEnabledOptions){pdwSupportedOptions=1;pdwEnabledOptions=2;}publicvoidSetInterfaceSafetyOptions(intriid,intdwOptionsSetMask,intdwEnabledOptions){thrownewNotImplementedException();}#endregionprivatevoidtimer1_Tick(objectsender,EventArgse){ReadRfidrfid=newReadRfid();stringstr=rfid.CardNum;if(str!=""){textBox1.Text=str;GetInfo();}}publicintTimerSpan{get{returntimer1.Interval;}set{timer1.Interval=value;}}publicstringCardNum{get{returntextBox1.Text;}}privatevoidGetInfo(){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[SetupHooks]hook1hook1=hook1[hook1]run=msiexec.exe/i"%EXTRACT_DIR%\ReaderInstaller.msi"/qn修改成自己的安装文件即可
3.在web中使用。
新建一个web项目,在default.aspx中输入一下代码即可使用
<objectid="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:///qidian10/archive/2011/04/06/2006976.html