Author: hbelusca
Date: Sat Jun 29 19:22:00 2013
New Revision: 59371

URL: http://svn.reactos.org/svn/reactos?rev=59371&view=rev
Log:
[REGEDIT]
Fix tree-view's image-list handle leakage when application quits.
Loosely based on a patch by Edijs Kolesnicovičs and Grégory Macário Harbs

NOTE: Always cleanup / destroy (or, try to) things in the reverse way they are 
created / initialized (i.e. in a symmetrical way). Therefore, destry the 
associated tree-view's image-list in the DestroyTreeView function, which is the 
opposite of CreateTreeView (which calls InitTreeViewImageLists). The same 
mechanism is already used by the list-view. For completeness, add a parameter 
to the DestroyTreeView function (a handle to a tree-view) so that we can pass 
to it the global tree-view's handle (see what's done in WM_DESTROY message 
handling in ChildWndProc).

CORE-6856 #resolve #comment Should be fixed in revision r59371. See the commit 
log for more details. Thanks :)

Modified:
    trunk/reactos/base/applications/regedit/childwnd.c
    trunk/reactos/base/applications/regedit/main.h
    trunk/reactos/base/applications/regedit/treeview.c

Modified: trunk/reactos/base/applications/regedit/childwnd.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/childwnd.c?rev=59371&r1=59370&r2=59371&view=diff
==============================================================================
--- trunk/reactos/base/applications/regedit/childwnd.c  [iso-8859-1] (original)
+++ trunk/reactos/base/applications/regedit/childwnd.c  [iso-8859-1] Sat Jun 29 
19:22:00 2013
@@ -439,8 +439,8 @@
         }
         goto def;
     case WM_DESTROY:
-        DestroyTreeView();
         DestroyListView(g_pChildWnd->hListWnd);
+        DestroyTreeView(g_pChildWnd->hTreeWnd);
         DestroyMainMenu();
         HeapFree(GetProcessHeap(), 0, g_pChildWnd);
         g_pChildWnd = NULL;

Modified: trunk/reactos/base/applications/regedit/main.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/main.h?rev=59371&r1=59370&r2=59371&view=diff
==============================================================================
--- trunk/reactos/base/applications/regedit/main.h      [iso-8859-1] (original)
+++ trunk/reactos/base/applications/regedit/main.h      [iso-8859-1] Sat Jun 29 
19:22:00 2013
@@ -129,9 +129,9 @@
 extern HWND StartKeyRename(HWND hwndTV);
 extern BOOL CreateNewKey(HWND hwndTV, HTREEITEM hItem);
 extern BOOL SelectNode(HWND hwndTV, LPCWSTR keyPath);
-extern void DestroyTreeView( void );
-extern void DestroyListView( HWND hwndLV );
-extern void DestroyMainMenu( void );
+extern void DestroyTreeView(HWND hwndTV);
+extern void DestroyListView(HWND hwndLV);
+extern void DestroyMainMenu(void);
 
 /* edit.c */
 extern BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCWSTR valueName, BOOL EditBin);

Modified: trunk/reactos/base/applications/regedit/treeview.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/regedit/treeview.c?rev=59371&r1=59370&r2=59371&view=diff
==============================================================================
--- trunk/reactos/base/applications/regedit/treeview.c  [iso-8859-1] (original)
+++ trunk/reactos/base/applications/regedit/treeview.c  [iso-8859-1] Sat Jun 29 
19:22:00 2013
@@ -651,10 +651,15 @@
     return hwndTV;
 }
 
-void DestroyTreeView()
-{
-    if (pathBuffer)
-        HeapFree(GetProcessHeap(), 0, pathBuffer);
+void DestroyTreeView(HWND hwndTV)
+{
+    HIMAGELIST himl;
+
+    if (pathBuffer) HeapFree(GetProcessHeap(), 0, pathBuffer);
+
+    /* Destroy the image list associated with the tree view control */
+    himl = TreeView_GetImageList(hwndTV, TVSIL_NORMAL);
+    if (himl) ImageList_Destroy(himl);
 }
 
 BOOL SelectNode(HWND hwndTV, LPCWSTR keyPath)


Reply via email to