From 9ca4f9b65a2aa28c0a00a729efcb36bafc20d666 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 13 Feb 2014 18:02:24 +0100 Subject: [PATCH] urlmon: Unregister window class on DLL unload. --- dlls/urlmon/bindprot.c | 50 +++++++++++++++++++++++---------------- dlls/urlmon/urlmon_main.c | 1 + dlls/urlmon/urlmon_main.h | 1 + 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/dlls/urlmon/bindprot.c b/dlls/urlmon/bindprot.c index b11856b73dd..7f2bea1c26d 100644 --- a/dlls/urlmon/bindprot.c +++ b/dlls/urlmon/bindprot.c @@ -83,14 +83,36 @@ static LRESULT WINAPI notif_wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM return DefWindowProcW(hwnd, msg, wParam, lParam); } +static const WCHAR wszURLMonikerNotificationWindow[] = + {'U','R','L',' ','M','o','n','i','k','e','r',' ', + 'N','o','t','i','f','i','c','a','t','i','o','n',' ','W','i','n','d','o','w',0}; + +static ATOM notif_wnd_class; + +static BOOL WINAPI register_notif_wnd_class(INIT_ONCE *once, void *param, void **context) +{ + static WNDCLASSEXW wndclass = { + sizeof(wndclass), 0, notif_wnd_proc, 0, 0, + NULL, NULL, NULL, NULL, NULL, + wszURLMonikerNotificationWindow, NULL + }; + + wndclass.hInstance = hProxyDll; + notif_wnd_class = RegisterClassExW(&wndclass); + return TRUE; +} + +void unregister_notif_wnd_class(void) +{ + if(notif_wnd_class) + UnregisterClassW(MAKEINTRESOURCEW(notif_wnd_class), hProxyDll); +} + HWND get_notif_hwnd(void) { - static ATOM wnd_class = 0; tls_data_t *tls_data; - static const WCHAR wszURLMonikerNotificationWindow[] = - {'U','R','L',' ','M','o','n','i','k','e','r',' ', - 'N','o','t','i','f','i','c','a','t','i','o','n',' ','W','i','n','d','o','w',0}; + static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT; tls_data = get_tls_data(); if(!tls_data) @@ -101,23 +123,11 @@ HWND get_notif_hwnd(void) return tls_data->notif_hwnd; } - if(!wnd_class) { - static WNDCLASSEXW wndclass = { - sizeof(wndclass), 0, - notif_wnd_proc, 0, 0, - NULL, NULL, NULL, NULL, NULL, - wszURLMonikerNotificationWindow, - NULL - }; + InitOnceExecuteOnce(&init_once, register_notif_wnd_class, NULL, NULL); + if(!notif_wnd_class) + return NULL; - wndclass.hInstance = hProxyDll; - - wnd_class = RegisterClassExW(&wndclass); - if (!wnd_class && GetLastError() == ERROR_CLASS_ALREADY_EXISTS) - wnd_class = 1; - } - - tls_data->notif_hwnd = CreateWindowExW(0, wszURLMonikerNotificationWindow, + tls_data->notif_hwnd = CreateWindowExW(0, MAKEINTRESOURCEW(notif_wnd_class), wszURLMonikerNotificationWindow, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, hProxyDll, NULL); if(tls_data->notif_hwnd) diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c index 7b3f1fdb635..1204a6204b9 100644 --- a/dlls/urlmon/urlmon_main.c +++ b/dlls/urlmon/urlmon_main.c @@ -139,6 +139,7 @@ static void process_detach(void) free_session(); free_tls_list(); + unregister_notif_wnd_class(); } /*********************************************************************** diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index faab45a7acf..14a4f08f2b7 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -225,6 +225,7 @@ typedef struct { tls_data_t *get_tls_data(void) DECLSPEC_HIDDEN; +void unregister_notif_wnd_class(void) DECLSPEC_HIDDEN; HWND get_notif_hwnd(void) DECLSPEC_HIDDEN; void release_notif_hwnd(HWND) DECLSPEC_HIDDEN;