根据MSDN
DeleteObject函数删除逻辑笔,画笔,字体,位图,
区域或调板,释放与
宾语。删除对象后,指定的句柄不再
有效。
因此,一个人(我自己)会认为,一旦执行DeleteObject,该HANDLE将不再有效。但是,一旦在删除其他WinAPI调用保存对象之前删除::: GetObject()检索到的对象,该怎么办?
HFONT hFont = reinterpret_cast<HFONT>(::SendMessage(hwndCtrl, WM_GETFONT, 0, 0));
if (nullptr == hFont)
{
LOG_ERROR(L"Invalid font specified");
return false;
}
LOGFONT font = { 0 };
if (0 == ::GetObject(hFont, sizeof(font), &font))
{
LOG_ERROR(L"Failed getting font");
return false;
}
font.lfHeight = nSize;
::DeleteObject(hFont);
HFONT hFontEx = ::CreateFontIndirect(&font);
LPARAM lparam = MAKELPARAM(TRUE, 0);
WPARAM wparam = (WPARAM)(hFontEx);
SendMessage(hwndCtrl, WM_SETFONT, wparam, lparam);
如下例所示,如果我决定删除我的HFONT,那么在通过SendMessage发送新消息之前,我会检索到一些意外的结果,其他控件的字体也会更改,就像我产生了某种句柄泄漏一样。
最佳答案
因此,(我自己)会认为,一旦执行DeleteObject,
HANDLE不再有效。但是检索到的对象会怎样
通过:: GetObject()在删除对象之前将其删除
其他WinAPI调用?
使用GetObject,您可以获得对象的描述,而不是新对象。删除句柄后,它保持不变。
如以下示例所示,如果我决定删除自己的HFONT,
通过SendMessage发送新消息,我会检索到一些意外消息
结果,其他控件的字体发生了变化,就像我想
产生某种手柄泄漏。
如果要发送带有已删除的HFONT的消息,我想如果将其与任何其他垃圾一起发送,结果将是相同的。