Существует графическая библиотека, которая используется в DLL, загруженная в процесс. Похоже, утечка библиотеки (во время загрузки / выгрузки несколько раз количество дескрипторов GDI в диалоге свойств Process Explorer постоянно увеличивается для всего процесса).
Есть ли способ сохранить все дескрипторы GDI, созданные DLL в процессе, чтобы удалить их все после выгрузки DLL? Скажем, перехватить CreateBitmap () и так далее? Но как определить, создается ли ресурс нашей DLL, а не самим процессом?
С Уважением,
Есть ли способ сохранить все дескрипторы GDI, созданные DLL в процессе, чтобы удалить их все после выгрузки DLL? Скажем, перехватить CreateBitmap () и так далее? Но как определить, создается ли ресурс нашей DLL, а не самим процессом?
Нет. Вам нужно исправить эту проблему у источника. Если DLL действительно утечка ручек, вы должны исправить DLL.
Способ закрыть все дескрипторы, открытые DLL и освободить все ресурсы, заключается в использовании отдельного процесса, который загружает DLL и завершает работу после ее выгрузки. Таким образом, вы можете оценить, какое усилие больше: исправить DLL, найти другую DLL (которая не протекает и, возможно, не имеет много других ловушек), или реализовать межпроцессное взаимодействие, чтобы освободить дескрипторы и все еще использовать DLL. Если вы выберете последний способ, вы можете передавать растровые изображения, нарисованные между процессами, используя блок разделяемой памяти, синхронизироваться с использованием именованных событий и т. Д.
Чтобы определить вызывающего пользователя, вы должны получить трассировку стека для каждого вызова, посмотрите на RtlCaptureStackBackTrace.
Другой способ, который я бы попытался сделать, — это изменить эту DLL (я предполагаю, что у вас есть только двоичный файл DLL, а не исходный код: в противном случае вы можете исправить утечки), чтобы он использовал GDI33.DLL вместо GDI32.dll. Затем вы создаете GDI33.DLL, которая экспортирует те функции, которые используются этой DLL. GDI33.DLL перенаправляет вызовы GDI32.dll и собирает дескрипторы объектов GDI.