2011-02-07 341 views
0

我在VC++ 6.0中做RT模拟器。每当它执行时,没有开放式体系结构计算机(OAC,它是飞行中的总线控制器)开启,程序就会正常执行。但是,在OAC打开的情况下,该程序正在给调试断言失败 - 在Debug/.exe/wincore.cpp在行号。 980.可能是什么问题?如果可能,请提供解决方案。调试断言在.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; 
} 
+1

你能给我们提供更多的信息吗?就像错误信息的全文一样? (另外,为什么当你在问题中提到VC++ 6.0时,这个标记为VS 2005?) – 2011-02-07 14:40:08

回答

0

我觉得这个问题有什么做用的CWnd :: FromHwnd不当,如存储所产生的指针,后来使用它。如果必须存储某些内容,它应该是HWND,而不是CWnd *。

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

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获得的句柄,那就是当您断言失败时。究竟释放句柄意味着什么取决于你对它做了什么。人们只能猜测。