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)