根据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发送新消息之前,我会检索一些意外的结果,其他控件的字体也会改变,就好像我一样产生了某种手柄泄漏。
答案 0 :(得分:2)
所以一个人(我自己)会认为一旦执行了DeleteObject,就会 手柄不再有效。但是检索到的对象会发生什么 by :: GetObject()一旦删除对象,然后再保存它们 其他WinAPI电话?
使用GetObject,您可以获得对象的描述,而不是新对象。删除句柄后它保持不变。
如下例所示,如果我之前决定删除我的HFONT 通过SendMessage发送新消息,我检索了一些意外的消息 结果,其他控件的字体发生了变化,就好像我一样 产生了某种手柄泄漏。
如果你想发送一条删除了HFONT的消息,我想如果你发送任何其他垃圾,结果将是相同的。