Утечка ресурсов в CreateSolidBrush

Тема в разделе "WASM.WIN32", создана пользователем Marazm, 26 дек 2005.

  1. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    С наступающим всех;) Значит есть такая процедура (в esi находистся hDC, в ebx указаталь на DRAWITEMSTRUCT):
    Код (Text):
    1.  
    2. proc DrawFrameRect,dwWhite,dwGray,dwOffset
    3. local rect RECT
    4.       invoke CreateSolidBrush,[dwWhite]
    5.      lea ecx,[ebx+4*7]
    6.     push [dwGray]
    7.     push eax
    8.     push eax
    9.     push ecx
    10.     push esi
    11.     test dword[ebx+4*4],ODS_FOCUS
    12.       je @F
    13.       invoke InflateRect,ecx,3,3
    14. @@: call [FrameRect]
    15.     call [DeleteObject]
    16.     call [CreateSolidBrush]
    17.      and [rect.top],0
    18.      mov edx,[ebx+4*7+4*3]
    19.      mov [rect.bottom],edx
    20.      mov edx,[ebx+4*7+4*2]
    21.      mov [rect.left],edx
    22.      mov [rect.right],edx
    23.      lea ecx,[rect]
    24.     push eax
    25.     push eax
    26.     push ecx
    27.     push esi
    28.       invoke FrameRect,esi,ecx,eax
    29.      mov edx,[ebx+4*7+4*3]
    30.      mov [rect.bottom],edx
    31.      mov [rect.top],edx
    32.      and [rect.left],0
    33.     call [FrameRect]
    34.     сall [DeleteObject]
    35.      cmp [dwOffset],1
    36.      jne @F
    37.      lea eax,[ebx+4*7]
    38.       invoke OffsetRect,eax,1,1
    39. @@:  ret
    40. endp
    41.  


    TaskMan и OllyDbg (в XP SP2) показывают, что dwGray кисть при первом вызове данной процедуры не освобождается. Тут поднималась похожая тема 2 года назад, но ответа там не увидал (у меня офлайн форума на 29.11.2004). В MSDN по поводу "gdi leaks" тоже ничего путного не нашел (плохо искал?). Помогите, плиз.
     
  2. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Посмотри возврат от DeleteObject(), и GetLastError() прям после него.
     
  3. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    comrade

    DeleteObject возвращет 1, а GetLastError вроде INVALID_HANDLE не помню точно. а о чем это мне должно сказать? Хэндл-то валидный по-любому...
     
  4. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    INVALID_HANDLE, так значит CreateSolidBrush() не сработал?
     
  5. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    comrade

    так в том то и прикол что все правильно рисует, но не удаляет кисть!
     
  6. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Попробуй DeleteObject 3 раза вызвать.
     
  7. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    comrade

    шутка типа?;) я пробовал 2 раза. не проходит. 2-й раз возвращается 0
     
  8. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Значит всё ок... я бы долго с этим Маразмом не мучился. Всё таки маразм не оргазм :)



    А что именно TaskMan и OllyDbg говорят? Или ты на какой-то там счетчик смотришь (типа GDI Handles)?
     
  9. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Нет, еще в msdn какую-то штучку нарыл для подсчета GDI объектов. И SysInternalsосвский менеджер процессов тоже говорит что два лишних остается.
     
  10. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Так это же, как ты говоришь, один раз только происходит (только при первом вызове) - так что не беда. А если бы утечка было при КАЖДОМ вызове, это уже совсем другое дело.



    Ну а вообще, да, интересно почему и как.
     
  11. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    comrade

    эт понятно. ну ладно. спасибо
     
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Marazm

    А что показывает Olly в стеке при втором вызове DeleteObject? То, что передаётся в DeleteObject, совпадает со значением полученным от второго CreateSolidBrush?
     
  13. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Мораль: в начале программы создать глобальный объект - контейнер всех GDI объектов. Код любого рисования будет быстрее, так как не нужны Create.../Delete.... Также не будет утечки ресурсов, просто все объекты будут удалены по окончанию программы.
     
  14. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Извените за задержку с ответом. В стеке тоже значение что и в eax после вызова CreateSolidBrush. Заводить глобальные переменные тоже не очень хочется, ибо на скорость это особо не полияет - это не анимация ведь. Не так уж и часто на эти кнопки нажимать-то будут. Вот тестовое приложение. Утечка происходит при наведении на кнопку (со статиком нет проблем) и при "перетаскивании" (т.е. нажать на кнопку и "тянуть" ее). Также, можно навести на кнопку курсор, когда окошко в background'е и сразу 2 объекта не особождаются. Там же, в архиве, скриншот с показаниями Olly. Ваше мнение, господа?

    [​IMG] _1345590341__wasm.rar