From b68dbf4ea1294a98ca653f32e88b07be632a5bae Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 20 Dec 2017 01:21:44 +0300 Subject: [PATCH] comctl32/tooltips: Remove window subclass right before window is destroyed. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/comctl32/tooltips.c | 41 +++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/dlls/comctl32/tooltips.c b/dlls/comctl32/tooltips.c index bbf1693f4d2..405b1e9f5c4 100644 --- a/dlls/comctl32/tooltips.c +++ b/dlls/comctl32/tooltips.c @@ -1888,16 +1888,12 @@ TOOLTIPS_Destroy (TOOLTIPS_INFO *infoPtr) } } - /* remove subclassing */ - if (toolPtr->uInternalFlags & TTF_SUBCLASS) { - if (toolPtr->uInternalFlags & TTF_IDISHWND) { - RemoveWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1); - } - else { - RemoveWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1); - } + /* Reset subclassing data. */ + if (toolPtr->uInternalFlags & TTF_SUBCLASS) + SetWindowSubclass(toolPtr->uInternalFlags & TTF_IDISHWND ? (HWND)toolPtr->uId : toolPtr->hwnd, + TOOLTIPS_SubclassProc, 1, 0); } - } + Free (infoPtr->tools); } @@ -2117,12 +2113,13 @@ TOOLTIPS_WinIniChange (TOOLTIPS_INFO *infoPtr) static LRESULT CALLBACK -TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uID, DWORD_PTR dwRef) +TOOLTIPS_SubclassProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR uID, DWORD_PTR dwRef) { TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr ((HWND)dwRef); MSG msg; - switch(uMsg) { + switch (message) + { case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_LBUTTONUP: @@ -2130,17 +2127,23 @@ TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_ case WM_MBUTTONUP: case WM_RBUTTONDOWN: case WM_RBUTTONUP: - msg.hwnd = hwnd; - msg.message = uMsg; - msg.wParam = wParam; - msg.lParam = lParam; - TOOLTIPS_RelayEvent(infoPtr, &msg); - break; - + if (infoPtr) + { + msg.hwnd = hwnd; + msg.message = message; + msg.wParam = wParam; + msg.lParam = lParam; + TOOLTIPS_RelayEvent(infoPtr, &msg); + } + break; + case WM_NCDESTROY: + RemoveWindowSubclass(hwnd, TOOLTIPS_SubclassProc, 1); + break; default: break; } - return DefSubclassProc(hwnd, uMsg, wParam, lParam); + + return DefSubclassProc(hwnd, message, wParam, lParam); }