MFC中SendMessage,Release版出错Debug版不出错的一个最常见原因之深入剖析
来源:互联网 发布:js遍历json数组 的key 编辑:程序博客网 时间:2024/04/29 06:48
来自:http://blog.sina.com.cn/s/blog_47fa4cef0100s80j.html
编译器 vc6.0
也不知道网上有没有类似的文章,小弟斗胆在这里献丑一回;
最近一段时间,许多人发帖子说自己的MFC程序Release版会出错,而Debug版不会出错,记得在两年前我也曾遇到过类似的问题,但是没有进行深入研究,这两天我对这个问题作了一个深入的探讨发现了一个非常容易犯的错误,这也与VC编译器有关(不知道是微软的BUG还是怎么回事),首先我们看一个事例工程:
用VC新建一个Dialog工程,然后加入一个新的对话窗,并且生成一个对话窗类;然后在主对话窗的OnOK事件中建立那个新对话窗的非模态对话窗,例如下面:
void CADlg::OnOK()
{
m_pDlg = new CDlg1;//m_pDlg是类成员变量,新对话窗的指针
m_pDlg->Create(IDD_DIALOG1);
m_pDlg->ShowWindow(SW_SHOW);
}
然后加一个自定义消息:WM_MYMSG;
在新的对话窗的OnOK事件中向主对话窗发送WM_MYMSG消息;
void CDlg1::OnOK()
{
CWnd *pWnd = GetParent();
pWnd->SendMessage(WM_MYMSG);
}
下面我要说的就是最关键的地方了,我们为了响应WM_MYMSG消息通常有两种做法,一种是重载主对话窗的WindowProc虚函数,然后在函数内部响应这个消息,例如下面:
LRESULT CADlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
Switch(message)
{
case WM_MYMSG:
{
……
break;
}
}
return CDialog::WindowProc(message, wParam, lParam);
}
这种做法通常不会出错;
下面我们看第二种响应这个消息的方法;
首先在主对话窗中加入一个函数,例如下面:
VOID CADlg::OnMyMsg()