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

Debugging 调试断言在.exe/wincore.cpp中失败,debugging,visual-c++,visual-c++-6,assertions,Debugging,Visual C++,Visual C++ 6,Assertions,我正在用VC++6.0做一个RT模拟器。无论何时执行,在没有打开开放式体系结构计算机(OAC,它是飞行中的总线控制器)的情况下,程序都会正确执行。但在OAC打开的情况下,程序在第980行的Debug/.exe/wincore.cpp中给出调试断言失败。有什么问题吗?如果可能,请提供解决方案 这是copmlete DestroyWindow函数 BOOL CWnd::DestroyWindow() { if (m_hWnd == NULL) return FALSE;

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

这是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;
}

我认为这个问题与不恰当地使用CWnd::FromHwnd有关,比如存储结果指针,然后再使用它。如果必须存储某些内容,则应为HWND,而不是CWnd*


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

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

一种解决方案是重写
虚拟BOOL destronWindow()
,并确保在那里释放句柄

例如,如果要从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;
}
当然,您需要在
销毁窗口
中执行相反的操作,以确保释放内部句柄:

BOOL CMyDialog::DestroyWindow()
{
    // Take Acrobat out of modal dialog mode, and release our HWND
    AVAppEndModal();
    AVWindowDestroy(m_AVdlgWin);
    return CDialog::DestroyWindow();
}
本例假设CMyDialog始终是模态的


如果未能释放通过
GetSafeHwnd
获得的句柄,则会出现断言失败。释放句柄的确切含义取决于您对其所做的操作。人们只能猜测。

你能给我们更多的信息吗?喜欢错误消息的全文吗?(另外,当你在问题中提到VC++6.0时,为什么这个标签是VS2005?)