urlmon: Unregister window class on DLL unload.

This commit is contained in:
Jacek Caban 2014-02-13 18:02:24 +01:00 committed by Alexandre Julliard
parent 16acd97eb0
commit 9ca4f9b65a
3 changed files with 32 additions and 20 deletions

View File

@ -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)

View File

@ -139,6 +139,7 @@ static void process_detach(void)
free_session();
free_tls_list();
unregister_notif_wnd_class();
}
/***********************************************************************

View File

@ -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;