From: Zhiyi Zhang <zzhang@codeweavers.com> Registering window classes in DllMain() is prone to deadlocks. Tests show that comctl32 window classes should probably be registered in RegisterClassNameW(). Fix possible EA launcher hangs due to deadlocks. A deadlock can happen, like the following, based on Tim Clem's findings. Say there are two threads, T1 and T2. T1: does some COM stuff that results in registering the window class OleMainThreadWndClass. T1: NtUserRegisterClassExWOW() does get_desktop_window(). Because this is not a built-in class. T1: doesn't yet have a desktop window, so it makes one and calls register_builtin_classes(). T1: starts the pthread_once in register_builtin_classes() to actually register the classes. T1: starts calling NtUserRegisterClassExWOW() with its classes. T2: loads comctl32.dll, calls its PROCESS_ATTACH. It grabs the loader lock. T2: comctl32's DllMain starts registering its classes. T2: comctl32's attempts to register classes also call get_desktop_window(). T2: get_desktop_window hits the pthread_once in register_builtin_classes() and starts waiting for T1 to finish it. T1: some built-in class registration results in a LoadImageW call for a class's cursor. T1: LoadImage has to grab a resource, so it tries to grab the loader lock. T1: the loader lock is held by T2. Deadlock; T2 is waiting on T1, which is waiting on T2. --- dlls/comctl32/animate.c | 6 -- dlls/comctl32/comboex.c | 6 -- dlls/comctl32/comctl32.h | 37 ++------- dlls/comctl32/commctrl.c | 154 +++++++++++++++++-------------------- dlls/comctl32/datetime.c | 7 -- dlls/comctl32/header.c | 7 -- dlls/comctl32/hotkey.c | 7 -- dlls/comctl32/ipaddress.c | 6 -- dlls/comctl32/listview.c | 15 ---- dlls/comctl32/monthcal.c | 7 -- dlls/comctl32/nativefont.c | 7 -- dlls/comctl32/pager.c | 7 -- dlls/comctl32/progress.c | 11 --- dlls/comctl32/rebar.c | 7 -- dlls/comctl32/status.c | 13 ---- dlls/comctl32/tab.c | 7 -- dlls/comctl32/tests/misc.c | 5 +- dlls/comctl32/toolbar.c | 7 -- dlls/comctl32/tooltips.c | 22 ++---- dlls/comctl32/trackbar.c | 6 -- dlls/comctl32/treeview.c | 8 -- dlls/comctl32/updown.c | 11 --- dlls/comctl32_v6/syslink.c | 11 --- 23 files changed, 85 insertions(+), 289 deletions(-) diff --git a/dlls/comctl32/animate.c b/dlls/comctl32/animate.c index a3603b8bfbe..436faf920b4 100644 --- a/dlls/comctl32/animate.c +++ b/dlls/comctl32/animate.c @@ -971,9 +971,3 @@ void ANIMATE_Register(void) RegisterClassW(&wndClass); } - - -void ANIMATE_Unregister(void) -{ - UnregisterClassW(ANIMATE_CLASSW, NULL); -} diff --git a/dlls/comctl32/comboex.c b/dlls/comctl32/comboex.c index 5dc6b8d4ca0..7765df893cb 100644 --- a/dlls/comctl32/comboex.c +++ b/dlls/comctl32/comboex.c @@ -2173,9 +2173,3 @@ void COMBOEX_Register (void) RegisterClassW (&wndClass); } - - -void COMBOEX_Unregister (void) -{ - UnregisterClassW (WC_COMBOBOXEXW, NULL); -} diff --git a/dlls/comctl32/comctl32.h b/dlls/comctl32/comctl32.h index a3b683d4410..249befa3c08 100644 --- a/dlls/comctl32/comctl32.h +++ b/dlls/comctl32/comctl32.h @@ -244,56 +244,35 @@ BOOL WINAPI MirrorIcon(HICON *phicon1, HICON *phicon2); HRGN set_control_clipping(HDC hdc, const RECT *rect); -extern void ANIMATE_Register(void); -extern void ANIMATE_Unregister(void); +#if __WINE_COMCTL32_VERSION == 6 extern void BUTTON_Register(void); extern void COMBO_Register(void); -extern void COMBOEX_Register(void); -extern void COMBOEX_Unregister(void); extern void COMBOLBOX_Register(void); -extern void DATETIME_Register(void); -extern void DATETIME_Unregister(void); extern void EDIT_Register(void); +extern void LISTBOX_Register(void); +extern void SYSLINK_Register(void); +extern void STATIC_Register(void); +#endif +extern void ANIMATE_Register(void); +extern void COMBOEX_Register(void); +extern void DATETIME_Register(void); extern void FLATSB_Register(void); -extern void FLATSB_Unregister(void); extern void HEADER_Register(void); -extern void HEADER_Unregister(void); extern void HOTKEY_Register(void); -extern void HOTKEY_Unregister(void); extern void IPADDRESS_Register(void); -extern void IPADDRESS_Unregister(void); -extern void LISTBOX_Register(void); extern void LISTVIEW_Register(void); -extern void LISTVIEW_Unregister(void); extern void MONTHCAL_Register(void); -extern void MONTHCAL_Unregister(void); extern void NATIVEFONT_Register(void); -extern void NATIVEFONT_Unregister(void); extern void PAGER_Register(void); -extern void PAGER_Unregister(void); extern void PROGRESS_Register(void); -extern void PROGRESS_Unregister(void); extern void REBAR_Register(void); -extern void REBAR_Unregister(void); -extern void STATIC_Register(void); extern void STATUS_Register(void); -extern void STATUS_Unregister(void); -#if __WINE_COMCTL32_VERSION == 6 -extern void SYSLINK_Register(void); -extern void SYSLINK_Unregister(void); -#endif extern void TAB_Register(void); -extern void TAB_Unregister(void); extern void TOOLBAR_Register(void); -extern void TOOLBAR_Unregister(void); extern void TOOLTIPS_Register(void); -extern void TOOLTIPS_Unregister(void); extern void TRACKBAR_Register(void); -extern void TRACKBAR_Unregister(void); extern void TREEVIEW_Register(void); -extern void TREEVIEW_Unregister(void); extern void UPDOWN_Register(void); -extern void UPDOWN_Unregister(void); int MONTHCAL_MonthLength(int month, int year); diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index 9bf342ea800..80404b8990f 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -91,46 +91,83 @@ static const WORD wPattern55AA[] = static const WCHAR strCC32SubclassInfo[] = L"CC32SubclassInfo"; -#if __WINE_COMCTL32_VERSION == 6 -static void unregister_versioned_classes(void) +static const struct { -#define VERSION "6.0.2600.2982!" - static const char *classes[] = - { - VERSION WC_BUTTONA, - VERSION WC_COMBOBOXA, - VERSION "ComboLBox", - VERSION WC_EDITA, - VERSION WC_LISTBOXA, - VERSION WC_STATICA, - }; - int i; - - for (i = 0; i < ARRAY_SIZE(classes); i++) - UnregisterClassA(classes[i], NULL); - -#undef VERSION + const WCHAR *nameW; + void (*fn_register)(void); } +classes[] = +{ +#if __WINE_COMCTL32_VERSION == 6 + {L"Button", BUTTON_Register}, + {L"ComboBox", COMBO_Register}, + {L"ComboBoxEx32", COMBOEX_Register}, + {L"ComboLBox", COMBOLBOX_Register}, + {L"Edit", EDIT_Register}, + {L"flatsb_class32", FLATSB_Register}, + {L"ListBox", LISTBOX_Register}, + {L"msctls_hotkey32", HOTKEY_Register}, + {L"msctls_progress32", PROGRESS_Register}, + {L"msctls_statusbar32", STATUS_Register}, + {L"msctls_trackbar32", TRACKBAR_Register}, + {L"msctls_updown32", UPDOWN_Register}, + {L"NativeFontCtl", NATIVEFONT_Register}, + {L"ReBarWindow32", REBAR_Register}, + {L"Static", STATIC_Register}, + {L"SysAnimate32", ANIMATE_Register}, + {L"SysDateTimePick32", DATETIME_Register}, + {L"SysHeader32", HEADER_Register}, + {L"SysIPAddress32", IPADDRESS_Register}, + {L"SysLink", SYSLINK_Register}, + {L"SysListView32", LISTVIEW_Register}, + {L"SysMonthCal32", MONTHCAL_Register}, + {L"SysPager", PAGER_Register}, + {L"SysTabControl32", TAB_Register}, + {L"SysTreeView32", TREEVIEW_Register}, + {L"ToolbarWindow32", TOOLBAR_Register}, + {L"tooltips_class32", TOOLTIPS_Register}, +#else + {L"ComboBoxEx32", COMBOEX_Register}, + {L"flatsb_class32", FLATSB_Register}, + {L"msctls_hotkey32", HOTKEY_Register}, + {L"msctls_progress32", PROGRESS_Register}, + {L"msctls_statusbar32", STATUS_Register}, + {L"msctls_trackbar32", TRACKBAR_Register}, + {L"msctls_updown32", UPDOWN_Register}, + {L"NativeFontCtl", NATIVEFONT_Register}, + {L"ReBarWindow32", REBAR_Register}, + {L"SysAnimate32", ANIMATE_Register}, + {L"SysDateTimePick32", DATETIME_Register}, + {L"SysHeader32", HEADER_Register}, + {L"SysIPAddress32", IPADDRESS_Register}, + {L"SysListView32", LISTVIEW_Register}, + {L"SysMonthCal32", MONTHCAL_Register}, + {L"SysPager", PAGER_Register}, + {L"SysTabControl32", TAB_Register}, + {L"SysTreeView32", TREEVIEW_Register}, + {L"ToolbarWindow32", TOOLBAR_Register}, + {L"tooltips_class32", TOOLTIPS_Register}, #endif /* __WINE_COMCTL32_VERSION == 6 */ +}; -BOOL WINAPI RegisterClassNameW(const WCHAR *class) +static void unregister_classes(void) { -#if __WINE_COMCTL32_VERSION == 6 - static const struct + for (unsigned int i = 0; i < ARRAY_SIZE(classes); i++) { - const WCHAR nameW[16]; - void (*fn_register)(void); +#if __WINE_COMCTL32_VERSION == 6 + WCHAR versioned_class[40]; + + wcscpy(versioned_class, L"6.0.2600.2982!"); + wcscat(versioned_class, classes[i].nameW); + UnregisterClassW(versioned_class, NULL); +#else + UnregisterClassW(classes[i].nameW, NULL); +#endif } - classes[] = - { - { L"Button", BUTTON_Register }, - { L"ComboBox", COMBO_Register }, - { L"ComboLBox", COMBOLBOX_Register }, - { L"Edit", EDIT_Register }, - { L"ListBox", LISTBOX_Register }, - { L"Static", STATIC_Register }, - }; +} +BOOL WINAPI RegisterClassNameW(const WCHAR *class) +{ int min = 0, max = ARRAY_SIZE(classes) - 1; while (min <= max) @@ -144,7 +181,6 @@ BOOL WINAPI RegisterClassNameW(const WCHAR *class) if (res < 0) max = pos - 1; else min = pos + 1; } -#endif /* __WINE_COMCTL32_VERSION == 6 */ return FALSE; } @@ -184,63 +220,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) /* Get all the colors at DLL load */ COMCTL32_RefreshSysColors(); - - /* like comctl32 5.82+ register all the common control classes */ - ANIMATE_Register (); - COMBOEX_Register (); - DATETIME_Register (); - FLATSB_Register (); - HEADER_Register (); - HOTKEY_Register (); - IPADDRESS_Register (); - LISTVIEW_Register (); - MONTHCAL_Register (); - NATIVEFONT_Register (); - PAGER_Register (); - PROGRESS_Register (); - REBAR_Register (); - STATUS_Register (); -#if __WINE_COMCTL32_VERSION == 6 - SYSLINK_Register (); -#endif - TAB_Register (); - TOOLBAR_Register (); - TOOLTIPS_Register (); - TRACKBAR_Register (); - TREEVIEW_Register (); - UPDOWN_Register (); break; case DLL_PROCESS_DETACH: if (lpvReserved) break; /* unregister all common control classes */ - ANIMATE_Unregister (); - COMBOEX_Unregister (); - DATETIME_Unregister (); - FLATSB_Unregister (); - HEADER_Unregister (); - HOTKEY_Unregister (); - IPADDRESS_Unregister (); - LISTVIEW_Unregister (); - MONTHCAL_Unregister (); - NATIVEFONT_Unregister (); - PAGER_Unregister (); - PROGRESS_Unregister (); - REBAR_Unregister (); - STATUS_Unregister (); - TAB_Unregister (); - TOOLBAR_Unregister (); - TOOLTIPS_Unregister (); - TRACKBAR_Unregister (); - TREEVIEW_Unregister (); - UPDOWN_Unregister (); - -#if __WINE_COMCTL32_VERSION == 6 - SYSLINK_Unregister (); - - unregister_versioned_classes (); -#endif /* __WINE_COMCTL32_VERSION == 6 */ + unregister_classes (); /* delete local pattern brush */ DeleteObject (COMCTL32_hPattern55AABrush); diff --git a/dlls/comctl32/datetime.c b/dlls/comctl32/datetime.c index f7498842008..60e08f2815b 100644 --- a/dlls/comctl32/datetime.c +++ b/dlls/comctl32/datetime.c @@ -1801,10 +1801,3 @@ DATETIME_Register (void) RegisterClassW (&wndClass); } - - -void -DATETIME_Unregister (void) -{ - UnregisterClassW (DATETIMEPICK_CLASSW, NULL); -} diff --git a/dlls/comctl32/header.c b/dlls/comctl32/header.c index a21f4bb9934..2543e0afe21 100644 --- a/dlls/comctl32/header.c +++ b/dlls/comctl32/header.c @@ -2303,10 +2303,3 @@ HEADER_Register (void) RegisterClassW (&wndClass); } - - -VOID -HEADER_Unregister (void) -{ - UnregisterClassW (WC_HEADERW, NULL); -} diff --git a/dlls/comctl32/hotkey.c b/dlls/comctl32/hotkey.c index 484ab479c9f..032c57725b2 100644 --- a/dlls/comctl32/hotkey.c +++ b/dlls/comctl32/hotkey.c @@ -562,10 +562,3 @@ HOTKEY_Register (void) RegisterClassW (&wndClass); } - - -void -HOTKEY_Unregister (void) -{ - UnregisterClassW (HOTKEY_CLASSW, NULL); -} diff --git a/dlls/comctl32/ipaddress.c b/dlls/comctl32/ipaddress.c index 4e194af1c57..391e51f3958 100644 --- a/dlls/comctl32/ipaddress.c +++ b/dlls/comctl32/ipaddress.c @@ -700,9 +700,3 @@ void IPADDRESS_Register (void) RegisterClassW (&wndClass); } - - -void IPADDRESS_Unregister (void) -{ - UnregisterClassW (WC_IPADDRESSW, NULL); -} diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index 661a09bcc7f..f91e63f1f5b 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -11980,21 +11980,6 @@ void LISTVIEW_Register(void) RegisterClassW(&wndClass); } -/*** - * DESCRIPTION: - * Unregisters the window class. - * - * PARAMETER(S): - * None - * - * RETURN: - * None - */ -void LISTVIEW_Unregister(void) -{ - UnregisterClassW(WC_LISTVIEWW, NULL); -} - /*** * DESCRIPTION: * Handle any WM_COMMAND messages diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c index 52a18eb0593..c814998d2b6 100644 --- a/dlls/comctl32/monthcal.c +++ b/dlls/comctl32/monthcal.c @@ -3023,10 +3023,3 @@ MONTHCAL_Register(void) RegisterClassW(&wndClass); } - - -void -MONTHCAL_Unregister(void) -{ - UnregisterClassW(MONTHCAL_CLASSW, NULL); -} diff --git a/dlls/comctl32/nativefont.c b/dlls/comctl32/nativefont.c index ede08d155b6..4db6d9bc152 100644 --- a/dlls/comctl32/nativefont.c +++ b/dlls/comctl32/nativefont.c @@ -123,10 +123,3 @@ NATIVEFONT_Register (void) RegisterClassW (&wndClass); } - - -VOID -NATIVEFONT_Unregister (void) -{ - UnregisterClassW (WC_NATIVEFONTCTLW, NULL); -} diff --git a/dlls/comctl32/pager.c b/dlls/comctl32/pager.c index 8db7a76157f..fdf5ffbe136 100644 --- a/dlls/comctl32/pager.c +++ b/dlls/comctl32/pager.c @@ -1160,10 +1160,3 @@ PAGER_Register (void) RegisterClassW (&wndClass); } - - -VOID -PAGER_Unregister (void) -{ - UnregisterClassW (WC_PAGESCROLLERW, NULL); -} diff --git a/dlls/comctl32/progress.c b/dlls/comctl32/progress.c index 9b7a1617e20..539dacf8fdf 100644 --- a/dlls/comctl32/progress.c +++ b/dlls/comctl32/progress.c @@ -822,14 +822,3 @@ void PROGRESS_Register (void) RegisterClassW (&wndClass); } - - -/*********************************************************************** - * PROGRESS_Unregister [Internal] - * - * Unregisters the progress bar window class. - */ -void PROGRESS_Unregister (void) -{ - UnregisterClassW (PROGRESS_CLASSW, NULL); -} diff --git a/dlls/comctl32/rebar.c b/dlls/comctl32/rebar.c index 70dc66af816..27270a9b63c 100644 --- a/dlls/comctl32/rebar.c +++ b/dlls/comctl32/rebar.c @@ -3783,10 +3783,3 @@ REBAR_Register (void) mindragy = GetSystemMetrics (SM_CYDRAG); } - - -VOID -REBAR_Unregister (void) -{ - UnregisterClassW (REBARCLASSNAMEW, NULL); -} diff --git a/dlls/comctl32/status.c b/dlls/comctl32/status.c index ec68b8d3e0c..f27453aab8d 100644 --- a/dlls/comctl32/status.c +++ b/dlls/comctl32/status.c @@ -1307,16 +1307,3 @@ STATUS_Register (void) RegisterClassW (&wndClass); } - - -/*********************************************************************** - * STATUS_Unregister [Internal] - * - * Unregisters the status window class. - */ - -void -STATUS_Unregister (void) -{ - UnregisterClassW (STATUSCLASSNAMEW, NULL); -} diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c index a83d6a5277d..3a964c41608 100644 --- a/dlls/comctl32/tab.c +++ b/dlls/comctl32/tab.c @@ -3468,10 +3468,3 @@ TAB_Register (void) RegisterClassW (&wndClass); } - - -void -TAB_Unregister (void) -{ - UnregisterClassW (WC_TABCONTROLW, NULL); -} diff --git a/dlls/comctl32/tests/misc.c b/dlls/comctl32/tests/misc.c index 48fc0027dc9..155d9e34ab3 100644 --- a/dlls/comctl32/tests/misc.c +++ b/dlls/comctl32/tests/misc.c @@ -1397,7 +1397,6 @@ static void test_RegisterClassNameW(BOOL v6) for (i = 0; i < ARRAY_SIZE(v6_class_names); i++) { ret = pRegisterClassNameW(v6_class_names[i]); - todo_wine_if(i > 5) ok(ret, "RegisterClassNameW %s failed, error %lu.\n", wine_dbgstr_w(v6_class_names[i]), GetLastError()); } } @@ -1406,7 +1405,6 @@ static void test_RegisterClassNameW(BOOL v6) for (i = 0; i < ARRAY_SIZE(v5_class_names); i++) { ret = pRegisterClassNameW(v5_class_names[i]); - todo_wine ok(ret, "RegisterClassNameW %s failed, error %lu.\n", wine_dbgstr_w(v5_class_names[i]), GetLastError()); } } @@ -1421,12 +1419,10 @@ static void test_RegisterClassNameW(BOOL v6) /* GetClassInfoW() should succeed */ ret = GetClassInfoW(0, ANIMATE_CLASSW, &wc); - todo_wine ok(ret, "GetClassInfoW failed, error %lu.\n", GetLastError()); /* Test registering an already registered window class */ ret = pRegisterClassNameW(ANIMATE_CLASSW); - todo_wine ok(ret, "RegisterClassNameW failed, error %lu.\n", GetLastError()); /* Test registering an non-existent window class */ @@ -1435,6 +1431,7 @@ static void test_RegisterClassNameW(BOOL v6) /* There is no flatsb_class32 window class */ ret = pRegisterClassNameW(L"flatsb_class32"); + todo_wine ok(!ret, "RegisterClassNameW succeeded.\n"); winetest_pop_context(); diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c index df4a6e73415..3826b18d4c6 100644 --- a/dlls/comctl32/toolbar.c +++ b/dlls/comctl32/toolbar.c @@ -7045,13 +7045,6 @@ TOOLBAR_Register (void) RegisterClassW (&wndClass); } - -VOID -TOOLBAR_Unregister (void) -{ - UnregisterClassW (TOOLBARCLASSNAMEW, NULL); -} - static HIMAGELIST TOOLBAR_InsertImageList(PIMLENTRY **pies, INT *cies, HIMAGELIST himl, INT id) { HIMAGELIST himlold; diff --git a/dlls/comctl32/tooltips.c b/dlls/comctl32/tooltips.c index 028b4c8e57c..876736b11e4 100644 --- a/dlls/comctl32/tooltips.c +++ b/dlls/comctl32/tooltips.c @@ -2313,25 +2313,15 @@ TOOLTIPS_Register (void) hTooltipIcons[TTI_NONE] = NULL; hTooltipIcons[TTI_INFO] = LoadImageW(COMCTL32_hModule, - (LPCWSTR)MAKEINTRESOURCE(IDI_TT_INFO_SM), IMAGE_ICON, 0, 0, 0); + (LPCWSTR)MAKEINTRESOURCE(IDI_TT_INFO_SM), IMAGE_ICON, 0, 0, LR_SHARED); hTooltipIcons[TTI_WARNING] = LoadImageW(COMCTL32_hModule, - (LPCWSTR)MAKEINTRESOURCE(IDI_TT_WARN_SM), IMAGE_ICON, 0, 0, 0); + (LPCWSTR)MAKEINTRESOURCE(IDI_TT_WARN_SM), IMAGE_ICON, 0, 0, LR_SHARED); hTooltipIcons[TTI_ERROR] = LoadImageW(COMCTL32_hModule, - (LPCWSTR)MAKEINTRESOURCE(IDI_TT_ERROR_SM), IMAGE_ICON, 0, 0, 0); + (LPCWSTR)MAKEINTRESOURCE(IDI_TT_ERROR_SM), IMAGE_ICON, 0, 0, LR_SHARED); hTooltipIcons[TTI_INFO_LARGE] = LoadImageW(COMCTL32_hModule, - (LPCWSTR)MAKEINTRESOURCE(IDI_TT_INFO_MD), IMAGE_ICON, 0, 0, 0); + (LPCWSTR)MAKEINTRESOURCE(IDI_TT_INFO_MD), IMAGE_ICON, 0, 0, LR_SHARED); hTooltipIcons[TTI_WARNING_LARGE] = LoadImageW(COMCTL32_hModule, - (LPCWSTR)MAKEINTRESOURCE(IDI_TT_WARN_MD), IMAGE_ICON, 0, 0, 0); + (LPCWSTR)MAKEINTRESOURCE(IDI_TT_WARN_MD), IMAGE_ICON, 0, 0, LR_SHARED); hTooltipIcons[TTI_ERROR_LARGE] = LoadImageW(COMCTL32_hModule, - (LPCWSTR)MAKEINTRESOURCE(IDI_TT_ERROR_MD), IMAGE_ICON, 0, 0, 0); -} - - -VOID -TOOLTIPS_Unregister (void) -{ - int i; - for (i = TTI_INFO; i <= TTI_ERROR; i++) - DestroyIcon(hTooltipIcons[i]); - UnregisterClassW (TOOLTIPS_CLASSW, NULL); + (LPCWSTR)MAKEINTRESOURCE(IDI_TT_ERROR_MD), IMAGE_ICON, 0, 0, LR_SHARED); } diff --git a/dlls/comctl32/trackbar.c b/dlls/comctl32/trackbar.c index 04faae1efcd..b0b5d245e45 100644 --- a/dlls/comctl32/trackbar.c +++ b/dlls/comctl32/trackbar.c @@ -2093,9 +2093,3 @@ void TRACKBAR_Register (void) RegisterClassW (&wndClass); } - - -void TRACKBAR_Unregister (void) -{ - UnregisterClassW (TRACKBAR_CLASSW, NULL); -} diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c index 0618eeacf84..6cc49fa02ab 100644 --- a/dlls/comctl32/treeview.c +++ b/dlls/comctl32/treeview.c @@ -5973,14 +5973,6 @@ TREEVIEW_Register(void) RegisterClassW(&wndClass); } - -VOID -TREEVIEW_Unregister(void) -{ - UnregisterClassW(WC_TREEVIEWW, NULL); -} - - /* Tree Verification ****************************************************/ static inline void diff --git a/dlls/comctl32/updown.c b/dlls/comctl32/updown.c index ba7c89a822c..1a03d250638 100644 --- a/dlls/comctl32/updown.c +++ b/dlls/comctl32/updown.c @@ -1280,14 +1280,3 @@ void UPDOWN_Register(void) RegisterClassW( &wndClass ); } - - -/*********************************************************************** - * UPDOWN_Unregister [Internal] - * - * Unregisters the updown window class. - */ -void UPDOWN_Unregister (void) -{ - UnregisterClassW (UPDOWN_CLASSW, NULL); -} diff --git a/dlls/comctl32_v6/syslink.c b/dlls/comctl32_v6/syslink.c index 0880c0da527..ecf9b242704 100644 --- a/dlls/comctl32_v6/syslink.c +++ b/dlls/comctl32_v6/syslink.c @@ -2328,14 +2328,3 @@ VOID SYSLINK_Register (void) RegisterClassW (&wndClass); } - - -/*********************************************************************** - * SYSLINK_Unregister [Internal] - * - * Unregisters the SysLink window class. - */ -VOID SYSLINK_Unregister (void) -{ - UnregisterClassW (WC_LINK, NULL); -} -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9822