[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