在.exe / wincore.cpp中调试断言失败

时间:2011-02-07 14:30:56

标签: debugging visual-c++ vc6 assertions

我在VC ++ 6.0中做了一个RT模拟器。无论何时执行,如果没有开放式架构计算机(OAC,它是飞行中的总线控制器),程序就会正常执行。但是在OAC ON的情况下,该程序在第一行的Debug / .exe / wincore.cpp中给出了Debug断言失败。 980.可能是什么问题?如果可能,请提供解决方案。

这是copmlete DestroyWindow函数。

BOOL CWnd::DestroyWindow()
{
    if (m_hWnd == NULL)
        return FALSE;

    CHandleMap* pMap = afxMapHWND();
    ASSERT(pMap != NULL);
    CWnd* pWnd = (CWnd*)pMap->LookupPermanent(m_hWnd);
#ifdef _DEBUG
    HWND hWndOrig = m_hWnd;
#endif

#ifdef _AFX_NO_OCC_SUPPORT
    BOOL bResult = ::DestroyWindow(m_hWnd);
#else //_AFX_NO_OCC_SUPPORT
    BOOL bResult;
    if (m_pCtrlSite == NULL)
        bResult = ::DestroyWindow(m_hWnd);
    else
        bResult = m_pCtrlSite->DestroyControl();
#endif //_AFX_NO_OCC_SUPPORT

    // Note that 'this' may have been deleted at this point,
    //  (but only if pWnd != NULL)
    if (pWnd != NULL)
    {
        // Should have been detached by OnNcDestroy
#ifdef _DEBUG
//////////////////////////////HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!///////////////////
        ASSERT(pMap->LookupPermanent(hWndOrig) == NULL); //line 980
#endif
    }
    else
    {
#ifdef _DEBUG
        ASSERT(m_hWnd == hWndOrig);
#endif
        // Detach after DestroyWindow called just in case
        Detach();
    }
    return bResult;
}

2 个答案:

答案 0 :(得分:0)

我认为这个问题与使用CWnd :: FromHwnd不合适,比如存储结果指针,以及稍后使用它。如果必须存储某些内容,则应该是HWND,而不是CWnd *。

另一个问题可能是在一个线程中创建窗口并在另一个线程中销毁它。

答案 1 :(得分:0)

问题很可能是你正在调用CWnd::GetSafeHwnd()的某个地方,并且在窗口被销毁时仍然使用HWND句柄。换句话说,你正在摧毁其句柄在其他地方仍处于活动状态的CWnd

一种解决方案是覆盖virtual BOOL DestroyWindow(),并确保在那里释放你的句柄。

例如,如果您从Acrobat插件中显示模式对话框,则必须将窗口句柄传递给Acrobat,以让它知道您处于模态模式:

int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if(CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;
    // Put Acrobat into modal dialog mode
    m_AVdlgWin = AVWindowNewFromPlatformThing(AVWLmodal, 0, NULL, gExtensionID, GetSafeHwnd());
    AVAppBeginModal(m_AVdlgWin);
    AVWindowBecomeKey(m_AVdlgWin);
    return 0;
}

当然你需要在DestroyWindow中执行相反的操作,以确保释放内部句柄:

BOOL CMyDialog::DestroyWindow()
{
    // Take Acrobat out of modal dialog mode, and release our HWND
    AVAppEndModal();
    AVWindowDestroy(m_AVdlgWin);
    return CDialog::DestroyWindow();
}

此示例假设CMyDialog始终是模态的。

如果你没有释放GetSafeHwnd获得的句柄,那就是你得到断言失败的时候。究竟释放一个句柄意味着什么取决于你用它做了什么。人们只能猜测。