Jacek Caban : urlmon: Unregister window class on DLL unload.
Alexandre Julliard
julliard at winehq.org
Thu Feb 13 13:26:11 CST 2014
Module: wine
Branch: master
Commit: 9ca4f9b65a2aa28c0a00a729efcb36bafc20d666
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9ca4f9b65a2aa28c0a00a729efcb36bafc20d666
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Feb 13 18:02:24 2014 +0100
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 b11856b..7f2bea1 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
- };
-
- wndclass.hInstance = hProxyDll;
-
- wnd_class = RegisterClassExW(&wndclass);
- if (!wnd_class && GetLastError() == ERROR_CLASS_ALREADY_EXISTS)
- wnd_class = 1;
- }
+ InitOnceExecuteOnce(&init_once, register_notif_wnd_class, NULL, NULL);
+ if(!notif_wnd_class)
+ return NULL;
- 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 7b3f1fd..1204a62 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 faab45a..14a4f08 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;
More information about the wine-cvs
mailing list