我在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;
}
答案 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
获得的句柄,那就是你得到断言失败的时候。究竟释放一个句柄意味着什么取决于你用它做了什么。人们只能猜测。