[BROWSEUI] Don't leak the image lists created by CAddressBand and CToolsBand.
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 1 May 2017 13:43:22 +0000 (13:43 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 1 May 2017 13:43:22 +0000 (13:43 +0000)
svn path=/trunk/; revision=74441

reactos/dll/win32/browseui/addressband.cpp
reactos/dll/win32/browseui/addressband.h
reactos/dll/win32/browseui/toolsband.cpp

index 3cc67e0..618ad24 100644 (file)
@@ -205,6 +205,12 @@ HRESULT STDMETHODCALLTYPE CAddressBand::CloseDW(DWORD dwReserved)
     if (fAddressEditBox) fAddressEditBox.Release();
     if (fSite) fSite.Release();
 
+    if (m_himlNormal)
+        ImageList_Destroy(m_himlNormal);
+
+    if (m_himlHot)
+        ImageList_Destroy(m_himlHot);
+
     return S_OK;
 }
 
@@ -521,15 +527,12 @@ LRESULT CAddressBand::OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lPara
 void CAddressBand::CreateGoButton()
 {
     const TBBUTTON buttonInfo [] = { { 0, 1, TBSTATE_ENABLED, 0 } };
-    HIMAGELIST            normalImagelist;
-    HIMAGELIST            hotImageList;
     HINSTANCE             shellInstance;
 
-
     shellInstance = GetModuleHandle(_T("shell32.dll"));
-    normalImagelist = ImageList_LoadImageW(shellInstance, MAKEINTRESOURCE(IDB_GOBUTTON_NORMAL),
+    m_himlNormal = ImageList_LoadImageW(shellInstance, MAKEINTRESOURCE(IDB_GOBUTTON_NORMAL),
                                            20, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION);
-    hotImageList = ImageList_LoadImageW(shellInstance, MAKEINTRESOURCE(IDB_GOBUTTON_HOT),
+    m_himlHot = ImageList_LoadImageW(shellInstance, MAKEINTRESOURCE(IDB_GOBUTTON_HOT),
                                         20, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_CREATEDIBSECTION);
 
     fGoButton = CreateWindowEx(WS_EX_TOOLWINDOW, TOOLBARCLASSNAMEW, 0, WS_CHILD | WS_CLIPSIBLINGS |
@@ -538,10 +541,10 @@ void CAddressBand::CreateGoButton()
                                0, 0, 0, 0, m_hWnd, NULL, _AtlBaseModule.GetModuleInstance(), NULL);
     SendMessage(fGoButton, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
     SendMessage(fGoButton, TB_SETMAXTEXTROWS, 1, 0);
-    if (normalImagelist)
-        SendMessage(fGoButton, TB_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(normalImagelist));
-    if (hotImageList)
-        SendMessage(fGoButton, TB_SETHOTIMAGELIST, 0, reinterpret_cast<LPARAM>(hotImageList));
+    if (m_himlNormal)
+        SendMessage(fGoButton, TB_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(m_himlNormal));
+    if (m_himlHot)
+        SendMessage(fGoButton, TB_SETHOTIMAGELIST, 0, reinterpret_cast<LPARAM>(m_himlHot));
     SendMessage(fGoButton, TB_ADDSTRINGW,
                 reinterpret_cast<WPARAM>(_AtlBaseModule.GetResourceInstance()), IDS_GOBUTTONLABEL);
     SendMessage(fGoButton, TB_ADDBUTTONSW, 1, (LPARAM) &buttonInfo);
index 33b6d9a..5d345bc 100644 (file)
@@ -41,6 +41,9 @@ private:
     HWND                                    fGoButton;
     HWND                                    fComboBox;
     bool                                    fGoButtonShown;
+    HIMAGELIST                              m_himlNormal;
+    HIMAGELIST                              m_himlHot;
+
 public:
     CAddressBand();
     virtual ~CAddressBand();
index 5318f3a..3c58ab6 100644 (file)
@@ -40,6 +40,8 @@ private:
     CComPtr<IDockingWindowSite> fDockSite;
     GUID                        fExecCommandCategory;
     CComPtr<IOleCommandTarget>  fExecCommandTarget;
+    HIMAGELIST m_himlNormal;
+    HIMAGELIST m_himlHot;
 public:
     CToolsBand();
     virtual ~CToolsBand();
@@ -294,36 +296,16 @@ HRESULT STDMETHODCALLTYPE CToolsBand::SetSite(IUnknown* pUnkSite){
     SendMessage(TB_SETEXTENDEDSTYLE, 0, TBSTYLE_EX_HIDECLIPPEDBUTTONS | TBSTYLE_EX_MIXEDBUTTONS | TBSTYLE_EX_DRAWDDARROWS);
 
     HINSTANCE shell32Instance = GetModuleHandle(_T("shell32.dll"));
-    HBITMAP imgNormal = reinterpret_cast<HBITMAP>(
-        LoadImage(shell32Instance, MAKEINTRESOURCE(214),
-            IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_CREATEDIBSECTION));
+    m_himlNormal = ImageList_LoadImageW(shell32Instance, MAKEINTRESOURCE(214),
+                                           0, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_DEFAULTSIZE | LR_CREATEDIBSECTION);
 
-    HBITMAP imgHot = reinterpret_cast<HBITMAP>(
-        LoadImage(shell32Instance, MAKEINTRESOURCE(215),
-        IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_CREATEDIBSECTION));
-
-    if (imgNormal && imgHot)
-    {
-        BITMAP bitmapInfo;
-        GetObjectW(imgNormal, sizeof(bitmapInfo), &bitmapInfo);
-        HIMAGELIST himlNormal = ImageList_Create(bitmapInfo.bmHeight, bitmapInfo.bmHeight, ILC_COLOR32, 4, 4);
-        ImageList_Add(himlNormal, imgNormal, NULL);
-
-        GetObjectW(imgHot, sizeof(bitmapInfo), &bitmapInfo);
-        HIMAGELIST himlHot = ImageList_Create(bitmapInfo.bmHeight, bitmapInfo.bmHeight, ILC_COLOR32, 4, 4);
-        ImageList_Add(himlHot, imgHot, NULL);
-
-        SendMessage(TB_SETIMAGELIST, 0, (LPARAM) himlNormal);
-        SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM) himlHot);
-    }
+    m_himlHot = ImageList_LoadImageW(shell32Instance, MAKEINTRESOURCE(215),
+                                           0, 0, RGB(255, 0, 255), IMAGE_BITMAP, LR_DEFAULTSIZE | LR_CREATEDIBSECTION);
 
+    SendMessage(TB_SETIMAGELIST, 0, (LPARAM) m_himlNormal);
+    SendMessage(TB_SETHOTIMAGELIST, 0, (LPARAM) m_himlHot);
     SendMessage(TB_ADDBUTTONSW, numShownButtons, (LPARAM)&tbButtonsAdd);
 
-    if (imgNormal)
-        DeleteObject(imgNormal);
-    if (imgHot)
-        DeleteObject(imgHot);
-    
     return hResult;
 }
 
@@ -344,7 +326,6 @@ HRESULT STDMETHODCALLTYPE CToolsBand::GetWindow(HWND *lphwnd)
 
 HRESULT STDMETHODCALLTYPE CToolsBand::ContextSensitiveHelp(BOOL fEnterMode)
 {
-
     return E_NOTIMPL;
 }
 
@@ -357,7 +338,14 @@ HRESULT STDMETHODCALLTYPE CToolsBand::CloseDW(DWORD dwReserved)
 
     m_hWnd = NULL;
 
-    if (fDockSite) fDockSite.Release();
+    if (fDockSite)
+        fDockSite.Release();
+
+    if (m_himlNormal)
+        ImageList_Destroy(m_himlNormal);
+    
+    if (m_himlHot)
+        ImageList_Destroy(m_himlHot);
 
     return S_OK;
 }