C#接收自定义消息问题!
最近做一个接口,将酒店门锁卡集成到我们的酒馆系统中,客人开一间房就直接用我们的程序制卡实现开门。
门锁厂家提供的是delphi的dll接口,我的是c# winform程序。我用[DllImport("delphi.dll")]方式将其导入到我的程序中,按照dll接口说明可以实现制卡,但是每次制卡成功后我的酒馆程序就关闭了。原因排查后大概就是由我的自定义消息引起的。
当我把我自定义消息注释掉后,是卡制成功后程序退出,不注释自定义消息时,卡刚放到刷卡机上就退出(都没制成功)。
我在网上搜了自定义消息 ,重载了windows 的DefWndProc()方法。代码如下:
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
int i = 0;
IntPtr iaddr = m.LParam;
string readCardStr = ""; //读卡返回的信息
switch (m.Msg)
{
//检测到卡片(卡片有效)
case PWM_CARDVAILD:
i = YDD.ReadCard(iaddr, ref readCardStr);
listBox1.Items.Clear();
listBox1.Items.Add(readCardStr);
break;
//未检测到卡片(卡片无效)
case PWM_CARDNOVAILD:
listBox1.Items.Add("卡片无效,这是自定义消息");
break;
//写卡失败
case PWM_WRITEFAIL:
//MessageBox.Show("写卡失败,这是自定义消息");
listBox1.Items.Add("写卡失败,这是自定义消息");
break;
//系统授权成功
case PWM_GETSYSCODE:
listBox1.Items.Add("系统授权成功,这是自定义消息");
break;
case PWM_GETREADERDATA:
i = YDD.ReadCard(iaddr, ref readCardStr);
listBox1.Items.Add("获得开锁记录,这是自定义消息");
break;
default:
base.DefWndProc(ref m);
break;
}
}
到这里后,我不清楚程序为什么会自动退出,具体是什么造成的,而且也不能读卡,求高人帮我解决,实在头疼!
------解决方案--------------------
base.DefWndProc(ref m); 放到switch外看看,不要拦截消息
------解决方案--------------------学习,再帮顶。
------解决方案--------------------估计是异常退出了,检查dll调用部分,
------解决方案--------------------
估计遇到了没有捕获的异常。
你在 Main 方法中的Application.Run之前写一句
C# code
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);//捕获应用程序线程异常,这样会把没有捕获的异常抓取到。
------解决方案--------------------
先确定是调用哪个函数出错的;
------解决方案--------------------
你能打断点测试一下么?我估计是程序有异常你没捕获所以自动释放资源了。。。
我原先做过一个读卡制卡的功能,代码给你参考下:
//c++函数强制声明
[DllImport("mi.dll", EntryPoint = "API_OpenComm")]
public static extern IntPtr API_OpenComm(int nCom, int nBaudrate);
[DllImport("mi.dll", EntryPoint = "API_CloseComm")]
public static extern bool API_CloseComm(IntPtr commHandle);
[DllImport("mi.dll", EntryPoint = "API_ControlBuzzer")]
public static extern int API_ControlBuzzer(IntPtr commHandle, int DeviceAddress, byte freq, byte duration, ref byte buffer);
[DllImport("mi.dll", EntryPoint = "API_MF_Read")]
public static extern int API_MF_Read(IntPtr commHandle, int DeviceAddress, byte mode, byte blk_add, byte num_blk, ref byte snr, ref byte buffer);
//制卡
private void makeCard(object sender, DataGridViewCellEventArgs e)