windows – 我什么时候应该在位图上调用DeleteObject()
发布时间:2020-12-13 22:29:41 所属栏目:Windows 来源:网络整理
导读:我正在研究一些传统的Win32 / MFC项目. 我发现了以下(伪代码): HDC hDC = ::CreateCompatibleDC(hDCWnd);HANDLE hFileMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,PAGE_READWRITE,dwSize,FileMapName);HBITMAP hBmp = ::CreateDIBSection(hDCWnd,zBI,D
我正在研究一些传统的Win32 / MFC项目.
我发现了以下(伪代码): HDC hDC = ::CreateCompatibleDC(hDCWnd); HANDLE hFileMap = ::CreateFileMapping(INVALID_HANDLE_VALUE,PAGE_READWRITE,dwSize,FileMapName); HBITMAP hBmp = ::CreateDIBSection(hDCWnd,&zBI,DIB_RGB_COLORS,&pvNull,hFileMap,0); ::SelectObject(hDC,hBmp); ::DeleteObject(hBmp); ::CloseHandle(hFileMap); // .. do something with hDC .. ::DeleteDC(hDC); 这对我来说很奇怪.任何人都可以解释一下,在我对DC做某事之前删除位图和/或关闭文件句柄是否正确? 谢谢. 解决方法
不,这不对.代码调用SelectObject()以将位图选择到设备上下文中,然后调用DeleteObject()以尝试删除位图,同时仍在设备上下文中选择该位图.在这种情况下,DeleteObject()将失败,因此位图被泄露.
http://msdn.microsoft.com/en-us/library/dd183539(v=vs.85).aspx “当它仍然被选择到设备上下文中时,不要删除绘图对象(笔或画笔).” 编辑: 嗯,这很有趣.我尝试在设备上下文中选择位图时调用DeleteObject(),它也为我返回1.有趣的是,此时实际上并未删除位图;在“已删除”位图上调用GetObject()成功!但是,只要从设备上下文中选择了删除的位图,就会将其删除;此时调用GetObject()失败.我还通过观察任务管理器中的GDI句柄计数来验证.因此,如果位图当前被选择到设备上下文中,显然DeleteObject()将推迟删除,尽管我不相信任何地方都有记录. HDC hdc = CreateCompatibleDC(NULL); if (hdc != NULL) { HBITMAP hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_SAMPLE)); BITMAP bm = { 0 }; int numBytes; // this succeeds as expected numBytes = GetObject(hBitmap,sizeof(BITMAP),&bm); HBITMAP hOldBitmap = SelectBitmap(hdc,hBitmap); DeleteObject(hBitmap); // this succeeds -- NOT expected! numBytes = GetObject(hBitmap,&bm); SelectBitmap(hdc,hOldBitmap); // this fails as expected numBytes = GetObject(hBitmap,&bm); DeleteDC(hdc); } 最重要的是,您发布的代码似乎有效,但依赖于未记录的行为.我倾向于安全地发挥它并消除这种依赖性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- active-directory – 如何防止用户将XP机器插入网
- Powershell – 使用Powershell对Azure AD应用程序
- 取消/阻止由Windows“任务调度程序”延迟触发的任
- TrustedInstaller.exe占用Windows Server 2008中
- 汇编 – 为什么MS-DOS不初始化DS和ES寄存器?
- windows – SQL 2008,RAM或CPU的重要性是什么?
- 是否可以在Windows主机上执行Vagrant Ansible配置
- 如何在两个站点之间配置没有共享存储的拉伸群集?
- 如何在Windows XP上安排每日脚本运行?
- 开放源代码 – 打开Windows Workflow的替代方案
热点阅读