由于要在Web项目中采用RFID读取功能所以有必要开发Activex一般情况下开发Activex都采用VCVB等但对这两块不是很熟悉所以采用C#编写Activex的方式实现
本文方法参考网络
编写WindowsFromControls
发布WindowsFormControls为Activex
在web中使用该Activex
首先编写windows控件
如何编写不再详述(注意一个地方GUID自己用vs工具生成一个下面会用到我的CBDBCFFBB)
重要的类
using System;
using SystemRuntimeInteropServices;
namespace RFIDReader
{
public class ReadRfid
{
[DllImport(MasterRDdll)]
private static extern int rf_init_com(int port int baud);
[DllImport(MasterRDdll)]
private static extern int rf_request(short icdev byte model ref short TagType);
[DllImport(MasterRDdll)]
private static extern int rf_write(int icdev char _Adr char _Data);
[DllImport(MasterRDdll)]
private static extern int rf_anticoll(short icdev byte bcnt ref byte ppsnr ref byte pRLength);
[DllImport(MasterRDdll)]
private static extern int rf_ClosePort();
public string CardNum
{
get
{ return getCardNum(); }
}
private string getCardNum()
{
int post = ; //调用COM口 int baud = ;
int i = ;
byte model = ;
byte b = ;
short TagType = ;
byte[] buf = new byte[];
try
{
rf_init_com(post baud);
rf_request( model ref TagType);
rf_anticoll( ref buf[] ref b);
string s = ;
for (i = ; i < b; i++)
{
s = s + SystemConvertToString(longParse(buf[i]ToString()) )ToUpper();
}
rf_ClosePort();
if (s == )
{ throw (new Exception()); }
return s;
}
catch (Exception)
{
}
return ;
}
}
}
view sourceprint?
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;
using SystemRuntimeInteropServices;
namespace RFIDReader
{
[ComImport GuidAttribute(<SPAN >CBDBCFFBB</SPAN><SPAN > </SPAN>)] [InterfaceTypeAttribute(ComInterfaceTypeInterfaceIsIUnknown)]
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 SystemCollectionsGeneric;using SystemComponentModel;
using SystemDrawing;
using SystemData;
using SystemLinq;
using SystemText;
using SystemWindowsForms;
using SystemRuntimeInteropServices; using CJ;
namespace RFIDReader{
[Guid(CBDBCFFBB) ProgId(RFIDReaderReader) ComVisible(true)]
public partial class Reader : UserControlIObjectSafety
{
public Reader()
{
InitializeComponent();
}
#region IObjectSafety 成员
public void GetInterfacceSafyOptions(int riid out int pdwSupportedOptions out int pdwEnabledOptions)
{
pdwSupportedOptions = ;
pdwEnabledOptions = ;
}
public void SetInterfaceSafetyOptions(int riid int dwOptionsSetMask int dwEnabledOptions)
{
throw new NotImplementedException();
}
#endregion
private void timer_Tick(object sender EventArgs e)
{
ReadRfid rfid=new ReadRfid();
string str = rfidCardNum;
if (str != )
{
textBoxText = str; GetInfo();
}
}
public int TimerSpan
{
get { return timerInterval; }
set { timerInterval = value; }
} public string CardNum
{
get { return textBoxText; }
}
private void GetInfo()
{
thislabelText = cccc;
}
}
}
为了能够在所有客户端ie上显示控件要在程序的AssemblyInfocs里添加如下语句
[assembly: AllowPartiallyTrustedCallers()]
下一步右键该项目属性生成将为com互操作注册打上勾勾
然后编译如果没有问题那么测试下应该可以读取RFID的ID到文本框了
制作安装程序
跟普通的制作安装程序一样新建一个安装程序然后删掉里面的文件夹
鼠标右键空白区域》添加》项目输出》选择主输出
这样即可生成安装包了
到现在其实已经可以用了但为了方便我们可以进一步生成cab包
下载CABARCexe解压缩到bin目录中执行如下doc命令
cabarc n 生成的cab名cab 安装文件msi installinf
installinf内容如下
[version]
signature=$CHICAGO$
AdvancedINF=
[Setup Hooks]
hookhook=hook
[hook]
run=msiexecexe /i %EXTRACT_DIR%\ReaderInstallermsi /qn
修改称自己的安装文件即可
在web中使用
新建一个web项目在defaultaspx中输入一下代码即可使用
<object id=RFIDReader classid=clsid:CBDBCFFBB
codebase=RFID/RFIDREADERcab>
</object> 这里的clsid就是自己生成的GUID编号
这里的RFID使用的是MasterRDdll和CFComdll不同产品使用可能不同同时注意RFID的COM端口号本例为测试例子所以写死了COM口客户端IE浏览时需要将RFID的端口改成对应的
注意如果发布到服务器上客户端ie上无法显示控件那么请将访问地址添加到ie的受信任站点如果不能安装cab那么只能用户自己安装Activex了
原文链接