日期:2014-05-18  浏览次数:20921 次

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)