精易论坛

标题: 关于《使用GDI+在内存转换图像格式》的BUG [打印本页]

作者: 热水哥    时间: 2014-7-30 10:31
标题: 关于《使用GDI+在内存转换图像格式》的BUG
http://125.confly.eu.org/thread-31530-1-1.html
http://bbs.eyuyan.com/read.php?tid=127301
《使用GDI+在内存转换图像格式》这是个很老的例子了.偶尔听到一些易友说有时候代码会出错。其实当时我修复过BUG,但当时已超过了可编辑帖子的时间,于是一直没有重新发布代码,后来时间久了甚至忘记修改过哪些地方了。
今天也有易友提到这个问题,于是我还是重新检查了一下代码。
貌似主要问题出在这一句:
CreateStreamOnHGlobal (hMem, 真, Stream)
MSDN有这么一段话

If the caller sets the fDeleteOnRelease parameter to FALSE,then the caller must also free the hGlobal after the final release. Ifthe caller sets the fDeleteOnRelease parameter to TRUE, the finalrelease will automatically free the hGlobal as shown in the followingexample code.
if(pData->fDeleteOnRelease)
{
    Verify(0==GlobalFree(pData->hGlobal));
}



然而,那份代码已经手动调用了GlobalFree来释放资源,那么那行代码的第二个参数应该设置为“”,也就是这样:
CreateStreamOnHGlobal (hMem, 假, Stream)

另外,根据MSDN对CreateStreamOnHGlobal第一个参数的说明,其中有这么一句“The handle must be allocated as movable and nondiscardable”,也就是说,GlobalAlloc应该使用GMEM_MOVEABLE和GMEM_NODISCARD常量。由于GMEM_NODISCARD已经过时所以被忽略了,那么应该只需要设置成GMEM_MOVEABLE就可以了。

下面附件是修复BUG后的代码
使用GDI 在内存转换图像格式[email protected] (4.94 KB, 下载次数: 141)

另一种方法:
CreateStreamOnHGlobal (hMem, 真, Stream)时,把 GlobalFree (hMem) 这一行代码删除也是可以的。
既然fDeleteOnRelease选择了TRUE,那么对象释放的时候会自动Free掉HGLOBAL
虽然这也是仅仅删除一行代码,但也上传一份源码吧
使用GDI 在内存转换图像格式_Fix_bug_Free@20140729(另一种方法).rar (5 KB, 下载次数: 59)


作者: 深藏功舆名ゐ    时间: 2014-7-30 10:33
我也是易团的= =
作者: vhk    时间: 2014-7-30 10:43
支持支持
作者: 岩途    时间: 2014-7-30 10:48
下了            
作者: 改名字好难    时间: 2014-8-1 17:48
楼主叼炸天
作者: 焉知非福    时间: 2014-8-3 00:00
下载来看看吧,对API很模糊
作者: 豹豹    时间: 2014-8-4 18:09
我早就有了
作者: 拉钩    时间: 2014-8-9 13:21
不错,学习了
作者: wlakys    时间: 2014-8-26 12:19
支持下把.....
作者: 情殇    时间: 2014-9-2 23:57
好眼熟的头像
作者: a83669220    时间: 2014-11-19 14:45
楼主叼炸天
作者: 无名侠    时间: 2015-2-19 19:46
头像碉堡了!
作者: LLYY    时间: 2015-3-22 12:50
感激不尽!!!
作者: 190180697    时间: 2015-7-29 20:49
激动的我不知道说什么好,感谢楼主的辛苦付出和共享精神,我的屏幕快照模块也快要完成了正好遇到一个输出文件过大的问题,完成了的话会共享出来的,快照效率自我感觉相当不错。
作者: french007    时间: 2015-8-27 16:19
大神顶你
作者: sol9702    时间: 2016-1-9 21:13
不太会用,先学习一下。
作者: 1234虎    时间: 2018-7-7 19:52
不错,学习了
作者: lyjzyq    时间: 2024-4-17 18:17
6666666666666666666666




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4