关闭应用程序时的调试声明

时间:2019-02-08 11:06:59

标签: .net debugging visual-c++ mfc assert

我在关闭应用程序时收到以下调试声明:

enter image description here 我调试了流程,发现断言发生在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端。

2 个答案:

答案 0 :(得分:0)

从其他函数调用IEnumerable<Game>是错误的。通常,这些功能旨在响应窗口消息。在这种情况下,当您的窗口被破坏时,系统将发送CWnd::OnNcDestroy()消息(这是窗口被完全破坏之前的最后一条消息)

您可以将WM_NCDESTROY添加到窗口消息映射中。并添加此功能:

ON_WM_NCDESTROY

在这种情况下,您可以尝试以下方法:

void CMyWnd::OnNcDestroy() 
{
    CWnd::OnNcDestroy(); 
    ... do other cleanup
}

答案 1 :(得分:0)

在销毁窗口之前,切勿调用OnNcDestroy。您永远不要自己调用此处理程序。这是一条仅从Windows内部调用的消息。

调用OnNcDestroy时始终调用

DestroyWindowOnNcDestroyWM_NCDESTROY消息的处理程序,它是窗口收到的最后一条消息。此函数始终调用PostNCDestroy,最终将窗口句柄从内部句柄映射中删除。

DesroyWindow的调用必须按此顺序失败...