【问题标题】:Debug assertion on Closing of Application关闭应用程序的调试断言
【发布时间】:2019-07-02 14:51:45
【问题描述】:

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

我调试了流程,发现断言发生在 CWnd::DestroyWindow()

// Should have been detached by OnNcDestroy
#ifdef _DEBUG
            ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);

我的类是从 COleControl 派生的,而 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 方面。

【问题讨论】:

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


    【解决方案1】:

    在销毁窗口之前,您永远不应该调用OnNcDestroy。你永远不应该自己调用这个处理程序。这是一条仅在 Windows 内部调用的消息。

    OnNcDestroy 总是在 DestroyWindow 被调用时被调用。 OnNcDestroyWM_NCDESTROY 消息的处理程序,它是窗口收到的最后一条消息。这个函数总是调用PostNCDestroy,最终从内部句柄映射中移除窗口句柄。

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

    【讨论】:

      【解决方案2】:

      从其他函数调用CWnd::OnNcDestroy() 是错误的。通常,这些函数旨在响应窗口消息。在这种情况下,当你的窗口被销毁时,系统会发送WM_NCDESTROY消息(这将是窗口被完全销毁之前的最后一条消息)

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

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

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

      void CSimple::OnFinalRelease()
      {
          if (m_hWnd != NULL)
              DestroyWindow();
          else
              PostNcDestroy(); // add this
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-01
        • 2023-03-03
        • 2015-11-13
        • 1970-01-01
        • 2015-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        相关资源
        最近更新 更多