afxwin1.inl 558 :::::ASSERT(m_hDC != NULL); return (CBitmap*) SelectGdiObject(m_hDC, pBitmap->GetSafeHandle());

iyranly 2008-09-22 04:03:03
现象:程序长时间运行报错.
错误指向: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的部分修改掉了。

...全文
1141 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuren522 2011-08-23
  • 打赏
  • 举报
回复
我也遇到这个问题查了一天还没找到原因
hhhyz 2009-08-15
  • 打赏
  • 举报
回复
我也碰到了,正在找,花了不少时间了...
iyranly 2008-09-23
  • 打赏
  • 举报
回复
多谢各位仁兄。问题得到解决了。就是我在18楼中的那个问题。

结贴...
菜牛 2008-09-23
  • 打赏
  • 举报
回复
这个问题,只能说仔细检查创建/销毁是否对应,使用句柄前判断有效性,销毁句柄后赋值为NULL,便于判断。

根据你的错误,应该是CreateCompatibleDC(pDC);出错了,导致创建DC失败,才有后面的断言;这里创建失败,只能是pDC出错了,那么要看你怎么调用DrawMain(CDC *pDC, BOOL bSeeMark)的了。
建议你在DrawMain函数入口加一句
ASSERT_VALID(pDC);
可能就能抓住错误。
scq2099yt 2008-09-23
  • 打赏
  • 举报
回复
没用过8.2,用的是7.2没有问题,Vc6.0打了sp2补丁
jameshooo 2008-09-22
  • 打赏
  • 举报
回复
很久没用VC6了,以前安装BC的时候也没出过问题
iyranly 2008-09-22
  • 打赏
  • 举报
回复
还有,你们用的boundsChecker集成到VC 6 中不会报错吧。

我的BC8.2装上之后,运行VC环境,就报错了,VC就运行不了。

没办法,我只有把它卸载了后,先打开VC,再装boundsChecker,然后根据它的提示,去改源代码。

你们有没有遇到过这样的问题。我的Vc打了sp5补丁
iyranly 2008-09-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zhoujianhei 的回复:]
应该先判断是否为有效DC
if(!pDC->GetSafeHdc())
// 无效DC

if(!CreateCompatibleDC(pDC))
// 无效DC

怀疑pDC本来就无效。
[/Quote]

多谢捧场!
最后一次程序报错的时候,pdc是有效的,只不过SelectObject的时候其m_hDC为null了。

我一直断定它是GDI资源泄漏导致的。目前我已经找出一处问题,是HRGN h_rgn = CreatePolygonRgn(pts, 7, WINDING); 创建了一个区域,
但是画完后没有DeleteObject,原来用ChecksBound查的时候没有动态的数据,不会CreatePolygonRgn,所以那时候没有检查出这个错.

目前GDI资源不会不断增加了....还要测一天才能看到是否只有这个问题.....
zhoujianhei 2008-09-22
  • 打赏
  • 举报
回复
应该先判断是否为有效DC
if(!pDC->GetSafeHdc())
// 无效DC

if(!CreateCompatibleDC(pDC))
// 无效DC

怀疑pDC本来就无效。
iyranly 2008-09-22
  • 打赏
  • 举报
回复
非常感谢 ls的朋友,你的回复,我正在看你的帖子,这是一个郁闷的问题
scq2099yt 2008-09-22
  • 打赏
  • 举报
回复
楼主的问题我曾经碰到过类似的,程序运行一个上午就崩溃了。
后来解决了,是资源泄露的问题,画刷创建的问题。
楼主可以参考我下面的帖子,或许会有所启发:
http://topic.csdn.net/u/20080729/14/3bb57da8-a141-4b8a-baf2-3fb67df5c996.html
CHLX2003 2008-09-22
  • 打赏
  • 举报
回复
感觉你给出的代码没什么问题
去看看是不是哪内存泄露或越界了
ywapple 2008-09-22
  • 打赏
  • 举报
回复
俺来帮你顶起……
iyranly 2008-09-22
  • 打赏
  • 举报
回复
出错的时候
_AFXWIN_INLINE CBitmap* CDC::SelectObject(CBitmap* pBitmap)
{ ASSERT(m_hDC != NULL); return (CBitmap*) SelectGdiObject(m_hDC, pBitmap->GetSafeHandle());}

m_hDC 为 NULL 了
iyranly 2008-09-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jameshooo 的回复:]
CDrawBase中的m_rect是什么类型?
[/Quote]

RECT m_rect;
cnzdgs 2008-09-22
  • 打赏
  • 举报
回复
看起来就是资源泄露。
sys0001 2008-09-22
  • 打赏
  • 举报
回复
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());

判断下是否创建成功的操作。
jameshooo 2008-09-22
  • 打赏
  • 举报
回复
CDrawBase中的m_rect是什么类型?
cnzdgs 2008-09-22
  • 打赏
  • 举报
回复
错误发生在哪个消息的处理函数?DC是怎么得到的?出错时看一下程序占用资源的情况是否正常。
iyranly 2008-09-22
  • 打赏
  • 举报
回复
多谢楼上的回复。这个问题折腾了我一阵子了,由于程序比较大,几十个类绘制,不好跟哪。
加载更多回复(5)

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧