2011-02-07 108 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獲得的句柄,那就是當您斷言失敗時。究竟釋放句柄意味着什麼取決於你對它做了什麼。人們只能猜測。