一个网络扑克游戏,在2K下运行正常,但在98下运行时间稍微长点(也就十盘游戏左右,不到半小时),就可能出现白屏(游戏界面用很多位图贴上去的,而且richedit里面也白了,不过拉拉滚动条可以出来),另外一些窗口(比如大厅)里面的字和头像变达(偶尔)。但游戏还可以继续,扑克牌还能正常显示,聊天也可正常。再过一会(时间不等),弹出“必需的资源无法得到”,然后程序死掉,有时是机器死掉。开始怀疑是GDI泄漏,把游戏单独运行,所有GDI元素都用一个定时器不停的刷,但居然两个小时也没有出现问题。
后怀疑套接字阻塞(实在无法可想._|),但发现阻塞的时候界面也是灰的(用的对话框),而且此时游戏显然无法继续,聊天也不可能。刚才用BOUNDSCHECKER来查(第一次用),又遇到不少问题,简单的说,是如果把BOUNDCHECKER的Error Detection设为MAX,程序就不能执行,调试信息如下:
Loaded 'C:\WINNT\system32\IMAGEHLP.DLL', no matching symbolic information found.
First-chance exception in Tz80.exe (NTDLL.DLL): 0xC0000005: Access Violation.
这两句不停出现,只有中止执行。设为NORMAL可以执行,报的错误有:
HBITMAP hBmp=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_MASK));
HRGN hRgn=BitmapToRegion(hBmp,RGB(255,255,255));
::SetWindowRgn(GetSafeHwnd(),hRgn,TRUE);
DeleteObject(hRgn);//这句错:Invalid argument ImageList_Draw, argument 6, FLAGS: 0x00CC0020 0xCC0020 are not valid flags bits.  Valid flags bits are 0xF17还有一个同样的错误:m_ima.Draw(dc,m_Level1,pt,SRCCOPY);
m_Level1和m_ima都是再构造函数里面初始化的。pt在这句之前初始化,此函数有CStatic::OnPaint调用然后还有两个错误:
Resource leak: allocated by LoadLibraryA in dllinit.cpp (505), HANDLE: 0x6BC20000
Resource leak: allocated by LoadLibraryA in delayhlp.cpp (119), HANDLE: 0x74FD0000程序中没有调用任何DLL(除了连接到MFC),而且我新建一个空的对话框工程用BOUNDSCHECKER也有这俩错误。希望各位大侠出手,万分感谢。

解决方案 »

  1.   

    今天又测试了一盘,发现是那些GDI对象突然失效了,就好像被DeleteObject了一样。
    那些位图在程序里要不是以HBITMAP保存的,要不就是放到CImageList里面。而且要不是在类的构造函数里面初始化,就是在对话框的OnInitDialog里面初始化,在析构函数或者PostNcDestroy里面销毁。例如:
    CDlgGame::CDlgGame(...)
    {
    m_bmpBk=NULL;
    }
    CDlgGame::OnInitDialog()
    {
    m_bmpBk=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_GAMEBK));
    }
    CDlgGame::PostNcDestroy()
    {
    if(m_bmpBk!=NULL)DeleteObject(m_bmpBk);
    }或者
    CMyBtn::CMyBtn(CRect&r,COLORREF crMask,UINT bmpID)
    {
    m_ima.Create(r.Width(),r.Height(),ILC_COLORDDB|ILC_MASK,0,0);
    CBitmap bmp;
    bmp.LoadBitmap(bmpID);
    m_ima.Add(&bmp,crMask);
    }然后还有CFont对象也如此,白屏后字体变大应该是CFont对象无效了。
    我在LoabBitmap得到一个HBITMAP句柄后立刻用DeleteObject删掉它,但不置句柄为NULL,然后在OnPaint里面使用它,结果无论在98还是2K出来的就是白屏,和我在程序运行中出现的一样。关键是我在单机测试我的程序,无论怎样也出不来白屏那种状况。晕啊!!请教98在什么情况下,GDI对象会突然失效?
      

  2.   

    那你拿到2k,xp去试试啊
    看是否有同样的问题.
    单机测试不到 那就是网络问题了
    你来个多人测试吧。也只好给你友情UP。
      

  3.   

    谢谢两位。
    2K下完全正常。程序就是在2K下写的。
    网络问题也不好说。因为即使在白屏的时候套接字仍可正常工作,而我测试的时候用的是阻塞套接字,如果发生阻塞程序应该死锁。但实际情况时即使白屏也可以继续打牌聊天。就是在多人测试的时候发现的问题。但在网络上运行的时候象这种错误我该怎么调试?那些句柄本来都正常,突然一下不行了,不知道怎么去调试了。看起来象是程序运行过程中突发一个什么事件,导致GDI句柄突然无效。但我现在也不知道怎么去调试找到问题的原因。象HBITMAP这样的句柄的内存有可能被一些非法指针修改吗?搞不懂啊!大侠帮我!!!
      

  4.   

    win98下有个工具Rsrcmtr.exe(需要win98的安装盘单独安装)可以检测GDI资源,显示GDI资源的使用百分比,用那个工具测一下。
      

  5.   

    HBITMAP这样的句柄并没什么特殊,只是你要急得使用后要释放资源。
    delete m_handle;