Jacek Caban <jacek(a)codeweavers.com> writes:
@@ -83,15 +83,50 @@ 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 CRITICAL_SECTION notif_wnd_class_cs; +static CRITICAL_SECTION_DEBUG notif_wnd_class_cs_dbg = { + 0, 0, ¬if_wnd_class_cs, + { ¬if_wnd_class_cs_dbg.ProcessLocksList, ¬if_wnd_class_cs_dbg.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": notif_wnd_class") } +}; +static CRITICAL_SECTION notif_wnd_class_cs = { ¬if_wnd_class_cs_dbg, -1, 0, 0, 0, 0 }; + +static BOOL ensure_notif_wnd_class(void) +{ + EnterCriticalSection(¬if_wnd_class_cs); + + if(!notif_wnd_class) { + 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); + } + + LeaveCriticalSection(¬if_wnd_class_cs); + + return notif_wnd_class != 0; +}
You don't really need a whole new critical section for this. Just use InitOnce or interlocked functions. -- Alexandre Julliard julliard(a)winehq.org