Есть функция в 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 или кривые руки?