调试断言在.exe/wincore.cpp中失败
问题描述:
我在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;
}
答
我觉得这个问题有什么做用的CWnd :: FromHwnd不当,如存储所产生的指针,后来使用它。如果必须存储某些内容,它应该是HWND,而不是CWnd *。
另一个问题可能是在一个线程中创建窗口并在另一个线程中销毁它。
答
问题很可能是某个地方你打电话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
获得的句柄,那就是当您断言失败时。究竟释放句柄意味着什么取决于你对它做了什么。人们只能猜测。
你能给我们提供更多的信息吗?就像错误信息的全文一样? (另外,为什么当你在问题中提到VC++ 6.0时,这个标记为VS 2005?) – 2011-02-07 14:40:08