高分求解:关于从包中读取图片显示的奇怪问题?

maxying 2004-04-14 12:06:23
我用DX做的程序,图像格式为bmp,打包后通过下面的代码读取并显示,在Win2000/XP下均正常,但在Win98中就会死机,不知道为什么!在98中跟踪程序,只有极少数情况能够在死机前跟踪到断点,问题大概在CreateDIBSection中,pBits内存申请不成功,但这是API自动处理的东西,98中有什么特殊的吗?另外,如果我对图片不打包,而直接用API LoadImage则一切正常!可是如果是我的代码问题,怎么在XP中就没事呢?望高手指教!

BITMAPFILEHEADER bmfh;
BITMAPINFO* pbmi;
BYTE* pBits;
HBITMAP hBitmap;
DWORD dwInfoSize, dwProcess;
BOOL bSuccess;

bSuccess = ReadFile( m_hPackage, &bmfh, sizeof(BITMAPFILEHEADER), &dwProcess, NULL );
if( !bSuccess || ( dwProcess != sizeof(BITMAPFILEHEADER) ) || ( bmfh.bfType != * (WORD *) "BM" ) )
return NULL;

dwInfoSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER);
pbmi = (BITMAPINFO*) new BYTE[dwInfoSize];

bSuccess = ReadFile( m_hPackage, pbmi, dwInfoSize, &dwProcess, NULL );
if( !bSuccess || ( dwProcess != dwInfoSize ) )
{
delete []pbmi;
MessageBox( NULL, "Read file failed!", "Error", MB_ICONERROR | MB_OK );
return NULL;
}

// Create the DIB Section
hBitmap = CreateDIBSection( NULL, pbmi, DIB_RGB_COLORS, (void**)&pBits, NULL, 0 );
if( hBitmap == NULL )
{
MessageBox( NULL, "Not Enough Memory!", "Error", MB_ICONERROR | MB_OK );
delete []pbmi;
return NULL;
}

// Read in the bitmap bits
ReadFile( m_hPackage, pBits, bmfh.bfSize - bmfh.bfOffBits, &dwProcess, NULL );

delete []pbmi;
return hBitmap;
...全文
105 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
maxying 2004-04-23
  • 打赏
  • 举报
回复
感谢FengYuanMSFT(袁峰)的帮助,这个东西总算弄好了,先给分:) 字体的问题如果您知道还望指点一下,Win9x原来这么多不一样的地方~~
FengYuanMSFT 2004-04-21
  • 打赏
  • 举报
回复
Check for GDI resource leak. DeleteObject works differently on Win9X. It would not delete objects when it's still selected into an HDC.
maxying 2004-04-21
  • 打赏
  • 举报
回复
我换用CreateDIBitmap后,98问题解决了,只是感觉进入速度比较慢。分析原因就是CreateDIBSection中由系统分配的pBits总是失败,而用CreateDIBitmap可以在之前new出相应的空间,这样就没问题!还是不知道这个bug的真正原因是什么!

还有一个在98下的搞笑问题,我使用
hFont = CreateFont( 15, 5, 0, 0, 5, 1, 0, 0, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "Arial" );
SelectObject( hDC, hFont );
然后TextOut,一开始文字是我选择的字体,几秒钟之后就不对了,有时变小,有时变成乱码,但在2000/XP中一切正常!这东西也有兼容性问题?
FengYuanMSFT 2004-04-20
  • 打赏
  • 举报
回复
Check for GDI resource leak first. There were an article on MSDN Magazine several years ago talking about GDI handle leak detection on Win9X.
itmaster 2004-04-17
  • 打赏
  • 举报
回复
复杂
学习:)
maxying 2004-04-16
  • 打赏
  • 举报
回复
怎么没人理我?!
maxying 2004-04-14
  • 打赏
  • 举报
回复
感谢高手的回答,我有几个不明白的地方:
1.我的代码是参考Charles Petzold的《Windows程序设计》下册中的部分代码,对于压缩编码没有考虑,不过我的程序在2000/XP下运行良好,姑且可以肯定我用的图片没有压缩的,本着先解决Bug后增加功能的原则,可以先不管它了:)

2.我需要从一个图像包中读取图片数据,假定包没有加密和压缩处理,仅仅把bmp文件的数据顺序存放,我可以不用CreateDIBSection而使用CreateDIBitmap吗?这样有什么本质的好处或区别呢?

3.对于CreateDIBSection,当参数为DIB_RGB_COLORS时,不是会忽略掉hDC吗?(《Windows程序设计》上写的~~)

4.对于调试我是没辙了,同一个exe在XP没任何问题,在98就会在同一个地方死掉,跟踪的时候一般没拦截就死了(不是还没运行到断点),如果拦截的早,然后单步执行,只有极少数情况能跟踪到hBitmap = CreateDIBSection( NULL, pbmi, DIB_RGB_COLORS, (void**)&pBits, NULL, 0 );这句,然后我用GetLastError()返回的结果看,失败是因为内存不足!我的机器是512M内存啊!有的时候跟踪后能进去,但退出再进入还是会死(从这个界面到另一个界面),我真不知道这个Bug在哪了:(

望高手指教!
FengYuanMSFT 2004-04-14
  • 打赏
  • 举报
回复
1) Your method of reading image only works for uncomressed bitmaps. It does not work for RLE4 or RLE8 compressed image.

2) If you only want to display the image, you do not need a DIB section, just load as DIB and display using StretchDIBits.

3) Try passing a HDC to CreateDIBSection.

4) Does the code always fail on Win98, or only after running for sometimes? If later, you may have resource leak in your code. If former, step through your code.

5) Read my book.

Feng Yuan [MSFT] (www.fengyuan.com, blog.joycode.com/fyuan)

19,469

社区成员

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

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