现象:程序长时间运行报错.
错误指向:afxwin1.inl 558
_AFXWIN_INLINE CBitmap* CDC::SelectObject(CBitmap* pBitmap)
{ ASSERT(m_hDC != NULL); return (CBitmap*) SelectGdiObject(m_hDC, pBitmap->GetSafeHandle());}程序中有大量的绘制,如用CPen,CBrush,CFont等Graphics Object。使用BoundsChecker已经将Resource Leak的部分修改掉了。
错误指向:afxwin1.inl 558
_AFXWIN_INLINE CBitmap* CDC::SelectObject(CBitmap* pBitmap)
{ ASSERT(m_hDC != NULL); return (CBitmap*) SelectGdiObject(m_hDC, pBitmap->GetSafeHandle());}程序中有大量的绘制,如用CPen,CBrush,CFont等Graphics Object。使用BoundsChecker已经将Resource Leak的部分修改掉了。
挂着BoundsChecker长时间跑。
void CDrawBase::DrawMain(CDC *pDC, BOOL bSeeMark)
{
if (bSeeMark && !m_bCanDraw)
return; CMemDC dc(pDC, &((CRect)m_rect)); //Call stack 就到这里,程序出错,请看MemDC的代码:
dc.SetBkMode(TRANSPARENT);
DrawBackGround(&dc);
_DrawMain(&dc);
}以下是CMemDC的部分代码(该代码是从codeproject上面Get的,成熟的,经得起考验的,问题不会在这里):
CMemDC(CDC* pDC, const CRect* pRect = NULL) : CDC()
{
ASSERT(pDC != NULL); // Some initialization
m_pDC = pDC;
m_oldBitmap = NULL;
m_bMemDC = !pDC->IsPrinting();
// Get the rectangle to draw
if (pRect == NULL) {
pDC->GetClipBox(&m_rect);
} else {
m_rect = *pRect;
}
if (m_bMemDC) {
// Create a Memory DC
CreateCompatibleDC(pDC);
pDC->LPtoDP(&m_rect); m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_oldBitmap = SelectObject(&m_bitmap); //好,call stack到这里程序出错
SetMapMode(pDC->GetMapMode());
pDC->DPtoLP(&m_rect);
SetWindowOrg(m_rect.left, m_rect.top);
} else {
// Make a copy of the relevent parts of the current DC for printing
m_bPrinting = pDC->m_bPrinting;
m_hDC = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;
} // Fill background
FillSolidRect(m_rect, pDC->GetBkColor());
}ok,最后程序执行_AFXWIN_INLINE CBitmap* CDC::SelectObject(CBitmap* pBitmap) ,断言,出错...
_AFXWIN_INLINE CBitmap* CDC::SelectObject(CBitmap* pBitmap)
{ ASSERT(m_hDC != NULL); return (CBitmap*) SelectGdiObject(m_hDC, pBitmap->GetSafeHandle());} m_hDC 为 NULL 了
后来解决了,是资源泄露的问题,画刷创建的问题。
楼主可以参考我下面的帖子,或许会有所启发:
http://topic.csdn.net/u/20080729/14/3bb57da8-a141-4b8a-baf2-3fb67df5c996.html
if(!pDC->GetSafeHdc())
// 无效DCif(!CreateCompatibleDC(pDC))
// 无效DC怀疑pDC本来就无效。
多谢捧场!
最后一次程序报错的时候,pdc是有效的,只不过SelectObject的时候其m_hDC为null了。我一直断定它是GDI资源泄漏导致的。目前我已经找出一处问题,是HRGN h_rgn = CreatePolygonRgn(pts, 7, WINDING); 创建了一个区域,
但是画完后没有DeleteObject,原来用ChecksBound查的时候没有动态的数据,不会CreatePolygonRgn,所以那时候没有检查出这个错.目前GDI资源不会不断增加了....还要测一天才能看到是否只有这个问题.....
建议你在DrawMain函数入口加一句
ASSERT_VALID(pDC);可能就能抓住错误。