Использование API GetGuiResources WIn32

Я пытаюсь использовать GetGuiResources для поиска ресурсов графического интерфейса. используется моей программой. В качестве второго параметра принимает флаг. Мне интересно узнать разницу между GR_USEROBJECTS и GR_GDIOBJECTS . Я не мог найти никакой документации вокруг него. Кто-нибудь может объяснить, в чем между ними разница? Я также знаю, что по умолчанию одновременно может быть открыто не более 10 000 дескрипторов GDI. Учитывается ли значение, возвращаемое GR_GDIOBJECTS, как часть этого ограничения в 10 КБ?


person Naveen    schedule 27.06.2014    source источник


Ответы (1)


GR_USEROBJECTS — это объекты User32, окна и меню.

GR_GDIOBJECTS — это объекты Gdi32, такие как контексты устройств, шрифты, растровые изображения, курсоры, значки, кисти, перья, области, палитры, метафайлы, пути.

На самом деле очень мало смысла использовать GetGuiResources() в программе, эти значения легко видны в диспетчере задач. View + Select Columns и отметьте USER Objects и GDI Objects. Должна быть масса веб-страниц, рассказывающих об этих счетчиках.

Квота по умолчанию в 10 000 дескрипторов предназначена для каждого процесса. Существует ограничение на общее количество дескрипторов, созданных всеми процессами в сеансе, фоновый элемент здесь.

person Hans Passant    schedule 27.06.2014
comment
Спасибо за ваш ответ. Я пытаюсь выяснить утечку GDI в своем приложении и использую GetGuiResources для мониторинга использования. У меня есть еще один связанный вопрос. Имеет ли графический драйвер какое-либо отношение к утечкам GDI? т. е. может ли неисправный драйвер вызвать утечку GDI в моем приложении? - person Naveen; 29.06.2014
comment
Нет, драйвер устройства никогда не виноват. Утечка GDI — это чисто программная ошибка. Очень распространенная ошибка, если не считать того, что вы забыли освободить дескриптор с помощью соответствующей функции освобождения (их несколько), стандартная ошибка — забыть восстановить контекст устройства перед его уничтожением. Никогда не игнорируйте возвращаемое значение вызова SelectObject(), после этого потребуется еще один вызов SelectObject() для восстановления контроллера домена. - person Hans Passant; 07.07.2014
comment
Наконец-то разобрался с утечкой. Это было вызвано тем, что не были удалены дескрипторы растрового изображения, возвращенные вызовом GetIconInfo(). - person Naveen; 16.07.2014