根据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的消息,我想如果将其与任何其他垃圾一起发送,结果将是相同的。

10-06 14:24