本人的聊天程序在debug的版本下可以顺利发送和接收对方聊天消息,但是在release版本下却出现了严重问题,症状如下:第一次发送消息,对方能正常接收并显示,当第二次发送消息对方接收到消息后,也能显示,但接着程序就出错,按“调试”按钮后就进入一个汇编代码文件,按F5往下运行就弹出“无效的句柄”对话框。我现在不知该如何对release版本进行调试,只猜测问题可能出在以下函数中的ReceiveFrom():UINT CUUClientDlg::ChatRecvListening(LPVOID pParam)//等待接收对方消息的多线程处理函数
{
CUUClientDlg* pDlg=(CUUClientDlg*)(AfxGetApp()->m_pMainWnd);
CChatSocket* pSock=new CChatSocket(pDlg);
SOCKET* phSocket =(SOCKET *)pParam;
CString str; pSock->Attach(*phSocket);
int len;
while(1)
{
len=pSock->ReceiveFrom(&buf,sizeof(buf),strIP,nPort,0);
if(len==SOCKET_ERROR)
{
int error;
error=pSock->GetLastError();
return FALSE;
}
::SendMessage(pDlg->GetSafeHwnd(),WM_RECV_CHATMSG,0,0);
}
return TRUE;
}

解决方案 »

  1.   

    有无特殊的设置
    检查下和Debug版有何不同咯
      

  2.   

    ::SendMessage()改成PostMessage()试下。
      

  3.   

    终于找到原因,原来是自定义消息的问题。自定义消息的消息参数。
     MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。这也存在debug跟release的问题吗?答案是肯定的。在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn(); Debug情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消息体的参数没有添加,即应该写成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam);非常感谢这篇文章的解析
    http://dev.csdn.net/article/17/17068.shtm