С наступающим всех Значит есть такая процедура (в esi находистся hDC, в ebx указаталь на DRAWITEMSTRUCT): Код (Text): proc DrawFrameRect,dwWhite,dwGray,dwOffset local rect RECT invoke CreateSolidBrush,[dwWhite] lea ecx,[ebx+4*7] push [dwGray] push eax push eax push ecx push esi test dword[ebx+4*4],ODS_FOCUS je @F invoke InflateRect,ecx,3,3 @@: call [FrameRect] call [DeleteObject] call [CreateSolidBrush] and [rect.top],0 mov edx,[ebx+4*7+4*3] mov [rect.bottom],edx mov edx,[ebx+4*7+4*2] mov [rect.left],edx mov [rect.right],edx lea ecx,[rect] push eax push eax push ecx push esi invoke FrameRect,esi,ecx,eax mov edx,[ebx+4*7+4*3] mov [rect.bottom],edx mov [rect.top],edx and [rect.left],0 call [FrameRect] сall [DeleteObject] cmp [dwOffset],1 jne @F lea eax,[ebx+4*7] invoke OffsetRect,eax,1,1 @@: ret endp TaskMan и OllyDbg (в XP SP2) показывают, что dwGray кисть при первом вызове данной процедуры не освобождается. Тут поднималась похожая тема 2 года назад, но ответа там не увидал (у меня офлайн форума на 29.11.2004). В MSDN по поводу "gdi leaks" тоже ничего путного не нашел (плохо искал?). Помогите, плиз.
comrade DeleteObject возвращет 1, а GetLastError вроде INVALID_HANDLE не помню точно. а о чем это мне должно сказать? Хэндл-то валидный по-любому...
Значит всё ок... я бы долго с этим Маразмом не мучился. Всё таки маразм не оргазм А что именно TaskMan и OllyDbg говорят? Или ты на какой-то там счетчик смотришь (типа GDI Handles)?
Нет, еще в msdn какую-то штучку нарыл для подсчета GDI объектов. И SysInternalsосвский менеджер процессов тоже говорит что два лишних остается.
Так это же, как ты говоришь, один раз только происходит (только при первом вызове) - так что не беда. А если бы утечка было при КАЖДОМ вызове, это уже совсем другое дело. Ну а вообще, да, интересно почему и как.
Marazm А что показывает Olly в стеке при втором вызове DeleteObject? То, что передаётся в DeleteObject, совпадает со значением полученным от второго CreateSolidBrush?
Мораль: в начале программы создать глобальный объект - контейнер всех GDI объектов. Код любого рисования будет быстрее, так как не нужны Create.../Delete.... Также не будет утечки ресурсов, просто все объекты будут удалены по окончанию программы.
Извените за задержку с ответом. В стеке тоже значение что и в eax после вызова CreateSolidBrush. Заводить глобальные переменные тоже не очень хочется, ибо на скорость это особо не полияет - это не анимация ведь. Не так уж и часто на эти кнопки нажимать-то будут. Вот тестовое приложение. Утечка происходит при наведении на кнопку (со статиком нет проблем) и при "перетаскивании" (т.е. нажать на кнопку и "тянуть" ее). Также, можно навести на кнопку курсор, когда окошко в background'е и сразу 2 объекта не особождаются. Там же, в архиве, скриншот с показаниями Olly. Ваше мнение, господа? _1345590341__wasm.rar