我在关闭应用程序时收到以下调试声明:
我调试了流程,发现断言发生在CWnd :: DestroyWindow()
// Should have been detached by OnNcDestroy
#ifdef _DEBUG
ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);
我的类是从COleControl派生的,而后者又是从CWnd派生的。
对象创建是在.NET winform中进行的,在应用程序关闭时,将调用对象析构函数,并且断言即将出现。
我尝试过的事情:
1)在我的类析构函数上调用DestroyWindow():没有用
2)像下面那样重写OnFinalRelease并起作用:
void CSimple::OnFinalRelease()
{
if (!m_bFinalReleaseCalled)
{
m_bFinalReleaseCalled = TRUE;
ReleaseCaches();
CWnd::OnNcDestroy(); --> explicitly called OnNcDestroy()
if (m_hWnd != NULL)
DestroyWindow();
CCmdTarget::OnFinalRelease();
}
我不确定这是否正确。我也不确定问题是否出在.NET端。
答案 0 :(得分:0)
从其他函数调用IEnumerable<Game>
是错误的。通常,这些功能旨在响应窗口消息。在这种情况下,当您的窗口被破坏时,系统将发送CWnd::OnNcDestroy()
消息(这是窗口被完全破坏之前的最后一条消息)
您可以将WM_NCDESTROY
添加到窗口消息映射中。并添加此功能:
ON_WM_NCDESTROY
在这种情况下,您可以尝试以下方法:
void CMyWnd::OnNcDestroy()
{
CWnd::OnNcDestroy();
... do other cleanup
}
答案 1 :(得分:0)
在销毁窗口之前,切勿调用OnNcDestroy
。您永远不要自己调用此处理程序。这是一条仅从Windows内部调用的消息。
OnNcDestroy
时始终调用 DestroyWindow
。 OnNcDestroy
是WM_NCDESTROY
消息的处理程序,它是窗口收到的最后一条消息。此函数始终调用PostNCDestroy
,最终将窗口句柄从内部句柄映射中删除。
对DesroyWindow
的调用必须按此顺序失败...