Утечка GDI объектов в _ReplaceVistaBitmapFromImageList
От: maks__  
Дата: 24.11.09 00:17
Оценка:
Есть функция в WTL:
    void WTL.CCommandBarCtrlImpl._ReplaceVistaBitmapFromImageList(int nIndex)
    {
        // Delete existing bitmap
        if(m_arrVistaBitmap[nIndex] != NULL)
            ::DeleteObject(m_arrVistaBitmap[nIndex]);

        // Create display compatible memory DC
        HDC hDC = ::GetDC(NULL);
        CDC dcMem;
        dcMem.CreateCompatibleDC(hDC);
        HBITMAP hBitmapSave = dcMem.GetCurrentBitmap();

        // Create bitmap for menu item
        T* pT = static_cast<T*>(this);
        HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, hDC, dcMem);

        // Select saved bitmap back and replace bitmap in the array
        dcMem.SelectBitmap(hBitmapSave);
        m_arrVistaBitmap.SetAtIndex(nIndex, hBitmap);
    }
На Vista она у меня работает нормально, а на Windows 7 вызывает утечку GDI объектов. И на х86, и на 64-bit.

Если добавить в конце функции:
::ReleaseDC(0, hDC);
то объекты не утекают.

Это баг в WTL или кривые руки?
Re: Утечка GDI объектов в _ReplaceVistaBitmapFromImageList
От: migel  
Дата: 25.11.09 05:48
Оценка:
Здравствуйте, maks__, Вы писали:
Это баг в WTL ?
Re[2]: Утечка GDI объектов в _ReplaceVistaBitmapFromImageLis
От: maks__  
Дата: 25.11.09 09:59
Оценка:
M>Это баг в WTL ?

Это код из WTL, он вызывается при вызове WTL.CCommandBarCtrlImpl.ReplaceIcon. В результате вызова объекты утекают.
Не понял твой вопрос.
Re[2]: Утечка GDI объектов в _ReplaceVistaBitmapFromImageLis
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 25.11.09 10:05
Оценка:
Здравствуйте, migel, Вы писали:

M>Здравствуйте, maks__, Вы писали:

M>Это баг в WTL ?

Забавно, что даже в транке это до сих пор не пофиксано.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[3]: Утечка GDI объектов в _ReplaceVistaBitmapFromImageLis
От: migel  
Дата: 26.11.09 08:52
Оценка:
Здравствуйте, maks__, Вы писали:

M>>Это баг в WTL

__>Не понял твой вопрос.
Извени, просто BackSpace не дожал
На самом деле это баг в WTL — контекст освобождать надо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.