ATL,直接调用DestroyWindow,触发断言:Object deleted before window was destroyed。

时间:2021-04-01 19:45:52
首先说明,有一个窗口类A继承自WindowImpl类。
我是在WM_KILLFOCUS里面调用DestroyWindow,然后就触发了这个断言:

virtual ~CWindowImplRoot()
{
#ifdef _DEBUG
if(m_hWnd != NULL) // should be cleared in WindowProc
{
ATLTRACE(atlTraceWindowing, 0, _T("ERROR - Object deleted before window was destroyed\n"));
ATLASSERT(FALSE);
}
#endif //_DEBUG
}

然后google找解决方法,提供的方法是重写WindowImplRoot的OnFinalMessage,但是我重写这个方法之后,根本就不会触发这个函数。然后也试过其他的关闭窗口方法,都是触发这个断言。
但是如果别的窗口调用这个窗口类的DestroyWindow,就不会触发断言。
请问这种情况应该怎么解决。

5 个解决方案

#1


人工置顶~~~~

#2


你没想过DestroyWindow失败的可能性吗?

窗口类A如果不是主窗口, 则应该在其父窗口的WM_DESTROY消息中调用A类的DestroyWindow.

如果是主窗口, 那请参考 ATL/WTL例子程序中的主窗口是怎么做的.

#3


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

在必要的地方加临界区或锁或等待事件。
《Windows核心编程》

#4


引用 3 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

在必要的地方加临界区或锁或等待事件。
《Windows核心编程》

天天发这个有意思么?

#5


引用 4 楼 sjjwind 的回复:
Quote: 引用 3 楼 zhao4zhong1 的回复:

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

在必要的地方加临界区或锁或等待事件。
《Windows核心编程》

天天发这个有意思么?

提醒:触发断言也是一种崩溃。

#1


人工置顶~~~~

#2


你没想过DestroyWindow失败的可能性吗?

窗口类A如果不是主窗口, 则应该在其父窗口的WM_DESTROY消息中调用A类的DestroyWindow.

如果是主窗口, 那请参考 ATL/WTL例子程序中的主窗口是怎么做的.

#3


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

在必要的地方加临界区或锁或等待事件。
《Windows核心编程》

#4


引用 3 楼 zhao4zhong1 的回复:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

在必要的地方加临界区或锁或等待事件。
《Windows核心编程》

天天发这个有意思么?

#5


引用 4 楼 sjjwind 的回复:
Quote: 引用 3 楼 zhao4zhong1 的回复:

崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

在必要的地方加临界区或锁或等待事件。
《Windows核心编程》

天天发这个有意思么?

提醒:触发断言也是一种崩溃。