[PATCH] programs/oleview: Use Treeview notifications to release created instances

Nikolay Sivov nsivov at codeweavers.com
Sun Feb 5 16:28:01 CST 2017


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---

This fixes a crash when closing oleview after Typelib viewer was opened at least once

 programs/oleview/oleview.c |  2 +-
 programs/oleview/tree.c    | 48 ++++++++++++++--------------------------------
 2 files changed, 15 insertions(+), 35 deletions(-)

diff --git a/programs/oleview/oleview.c b/programs/oleview/oleview.c
index f1713b81b3..d1877b042b 100644
--- a/programs/oleview/oleview.c
+++ b/programs/oleview/oleview.c
@@ -469,8 +469,8 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg,
             MenuCommand(LOWORD(wParam), hWnd);
             break;
         case WM_DESTROY:
-            OleUninitialize();
             EmptyTree();
+            OleUninitialize();
             PostQuitMessage(0);
             break;
         case WM_MENUSELECT:
diff --git a/programs/oleview/tree.c b/programs/oleview/tree.c
index decedc47e6..2a4ca6590c 100644
--- a/programs/oleview/tree.c
+++ b/programs/oleview/tree.c
@@ -604,40 +604,7 @@ static void AddBaseEntries(void)
 
 void EmptyTree(void)
 {
-    HTREEITEM cur, del;
-    TVITEMW tvi;
-
-    tvi.mask = TVIF_PARAM;
-    cur = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
-            TVGN_CHILD, (LPARAM)TVI_ROOT);
-
-    while(TRUE)
-    {
-        del = cur;
-        cur = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
-                TVGN_CHILD, (LPARAM)del);
-
-        if(!cur) cur = (HTREEITEM)SendMessageW(globals.hTree,
-                TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)del);
-        if(!cur)
-        {
-            cur = (HTREEITEM)SendMessageW(globals.hTree, TVM_GETNEXTITEM,
-                    TVGN_PREVIOUS, (LPARAM)del);
-            if(!cur) cur = (HTREEITEM)SendMessageW(globals.hTree,
-                    TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)del);
-
-            tvi.hItem = del;
-            if(SendMessageW(globals.hTree, TVM_GETITEMW, 0, (LPARAM)&tvi) && tvi.lParam)
-            {
-                if(((ITEM_INFO *)tvi.lParam)->loaded) ReleaseInst(del);
-                HeapFree(GetProcessHeap(), 0, (ITEM_INFO *)tvi.lParam);
-
-                SendMessageW(globals.hTree, TVM_DELETEITEM, 0, (LPARAM)del);
-            }
-
-            if(!cur) break;
-        }
-    }
+    SendMessageW(globals.hTree, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT);
 }
 
 void AddTreeEx(void)
@@ -678,6 +645,19 @@ static LRESULT CALLBACK TreeProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPa
                     RefreshMenu(((NMTREEVIEWW *)lParam)->itemNew.hItem);
                     RefreshDetails(((NMTREEVIEWW *)lParam)->itemNew.hItem);
                     break;
+                case TVN_DELETEITEMW:
+                {
+                    NMTREEVIEWW *nm = (NMTREEVIEWW*)lParam;
+                    ITEM_INFO *info = (ITEM_INFO*)nm->itemOld.lParam;
+
+                    if (info)
+                    {
+                        if (info->loaded)
+                            ReleaseInst(nm->itemOld.hItem);
+                        HeapFree(GetProcessHeap(), 0, info);
+                    }
+                    break;
+                }
             }
             break;
         case WM_SIZE:
-- 
2.11.0




More information about the wine-patches mailing list