0

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

这是完整的 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;
}
4

2 回答 2

0

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

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

于 2011-03-12T22:23:58.153 回答
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,那么您就会遇到断言失败。释放句柄的确切含义取决于您对它做了什么。只能猜测。

于 2015-11-03T22:59:27.320 回答