在 LBN_KILLFOCUS 后销毁 CListBox 导致异常
Destroying CListBox after LBN_KILLFOCUS leads to Exception
我的目标是在失去焦点后销毁 CListBox 对象。我在父对象中添加了以下代码:
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_LBN_KILLFOCUS(IDC_LISTBOX, OnLBKillFocus)
END_MESSAGE_MAP()
void CChildView::OnLBKillFocus()
{
listBox->DestroyWindow();
}
我创建了这样的对象:
listBox = new CListBox;
listBox->Create(WS_VISIBLE | WS_CHILD, CRect(10, 110, 100, 200), this, 1112);
但是在 OnLBKillFocus
函数执行后,我在 DefWindowProc
中得到一个异常。显然已经销毁的 ListBox 试图处理 WM_KILLFOCUS
消息并崩溃,因为 window 句柄是 NULL
.
这是堆栈跟踪的一部分:
mfc110ud.dll!CWnd::DefWindowProcW(unsigned int nMsg, unsigned int wParam, long lParam) Line 1141 C++
mfc110ud.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2138 C++
mfc110ud.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 290 C++
mfc110ud.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 453 C++
mfc110ud.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 304 C++
user32.dll!_InternalCallWinProc@20() Unknown
...
有没有人知道这次崩溃的原因是什么以及如何避免?
解耦应该引起破坏的动作和破坏本身。
收到WM_KILLFOCUS事件后,只需使用带有私人消息的PostMessage(已注册window消息或WM_APP+n)并在收到此消息后销毁window.
我的目标是在失去焦点后销毁 CListBox 对象。我在父对象中添加了以下代码:
BEGIN_MESSAGE_MAP(CChildView, CWnd)
ON_LBN_KILLFOCUS(IDC_LISTBOX, OnLBKillFocus)
END_MESSAGE_MAP()
void CChildView::OnLBKillFocus()
{
listBox->DestroyWindow();
}
我创建了这样的对象:
listBox = new CListBox;
listBox->Create(WS_VISIBLE | WS_CHILD, CRect(10, 110, 100, 200), this, 1112);
但是在 OnLBKillFocus
函数执行后,我在 DefWindowProc
中得到一个异常。显然已经销毁的 ListBox 试图处理 WM_KILLFOCUS
消息并崩溃,因为 window 句柄是 NULL
.
这是堆栈跟踪的一部分:
mfc110ud.dll!CWnd::DefWindowProcW(unsigned int nMsg, unsigned int wParam, long lParam) Line 1141 C++
mfc110ud.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2138 C++
mfc110ud.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 290 C++
mfc110ud.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 453 C++
mfc110ud.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 304 C++
user32.dll!_InternalCallWinProc@20() Unknown
...
有没有人知道这次崩溃的原因是什么以及如何避免?
解耦应该引起破坏的动作和破坏本身。
收到WM_KILLFOCUS事件后,只需使用带有私人消息的PostMessage(已注册window消息或WM_APP+n)并在收到此消息后销毁window.