Module: wine Branch: master Commit: 18697bb7b598ccff23def7822a2b96f52e7ccb00 URL: https://source.winehq.org/git/wine.git/?a=commit;h=18697bb7b598ccff23def7822...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Mar 7 14:41:42 2022 +0100
user32: Move module class registration to get_class_info.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/class.c | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-)
diff --git a/dlls/user32/class.c b/dlls/user32/class.c index 1855a2c3804..cf5fd27184b 100644 --- a/dlls/user32/class.c +++ b/dlls/user32/class.c @@ -332,7 +332,8 @@ static CLASS *find_class( HINSTANCE module, const WCHAR *name ) return NULL; }
-static const WCHAR *CLASS_GetVersionedName( const WCHAR *name, UINT *basename_offset, WCHAR *combined, BOOL register_class ) +static const WCHAR *CLASS_GetVersionedName( const WCHAR *name, UINT *basename_offset, WCHAR *combined, + HMODULE *reg_module ) { ACTCTX_SECTION_KEYED_DATA data; struct wndclass_redirect_data @@ -349,6 +350,7 @@ static const WCHAR *CLASS_GetVersionedName( const WCHAR *name, UINT *basename_of HMODULE hmod; UINT offset;
+ if (reg_module) *reg_module = 0; if (!basename_offset) basename_offset = &offset;
@@ -383,21 +385,7 @@ static const WCHAR *CLASS_GetVersionedName( const WCHAR *name, UINT *basename_of ret = combined; }
- if (register_class && hmod) - { - CLASS *class; - - if (!(class = find_class( hmod, ret ))) - { - BOOL (WINAPI *pRegisterClassNameW)(const WCHAR *class); - - pRegisterClassNameW = (void *)GetProcAddress(hmod, "RegisterClassNameW"); - if (pRegisterClassNameW) - pRegisterClassNameW(name); - } - else release_class_ptr( class ); - } - + if (reg_module) *reg_module = hmod; return ret; }
@@ -1237,28 +1225,42 @@ BOOL WINAPI GetClassInfoW( HINSTANCE hInstance, LPCWSTR name, WNDCLASSW *wc ) ATOM get_class_info( HINSTANCE instance, const WCHAR *name, WNDCLASSEXW *info, UNICODE_STRING *name_str, BOOL ansi ) { + const WCHAR *class_name; + HMODULE module; CLASS *class; ATOM atom;
+ class_name = CLASS_GetVersionedName( name, NULL, NULL, &module ); + if (!name_str && !instance) instance = user32_module;
if (name != (LPCWSTR)DESKTOP_CLASS_ATOM && (IS_INTRESOURCE(name) || wcsicmp( name, L"Message" ))) GetDesktopWindow(); /* create the desktop window to trigger builtin class registration */
- name = CLASS_GetVersionedName( name, NULL, NULL, TRUE ); - - while (name && !(class = find_class( instance, name ))) + while (class_name && !(class = find_class( instance, class_name ))) { - if (IS_INTRESOURCE( name )) break; - if (!is_comctl32_class( name )) break; + if (module) + { + BOOL (WINAPI *pRegisterClassNameW)( const WCHAR *class ); + pRegisterClassNameW = (void *)GetProcAddress( module, "RegisterClassNameW" ); + module = NULL; + if (pRegisterClassNameW) + { + TRACE( "registering %s\n", debugstr_w(name) ); + pRegisterClassNameW( name ); + continue; + } + } + if (IS_INTRESOURCE( class_name )) break; + if (!is_comctl32_class( class_name )) break; if (GetModuleHandleW( L"comctl32.dll" )) break; if (!LoadLibraryW( L"comctl32.dll" )) break; - TRACE( "%s retrying after loading comctl32\n", debugstr_w(name) ); + TRACE( "%s retrying after loading comctl32\n", debugstr_w(class_name) ); }
if (!class) { - TRACE("%s %p -> not found\n", debugstr_w(name), instance); + TRACE("%s %p -> not found\n", debugstr_w(class_name), instance); SetLastError( ERROR_CLASS_DOES_NOT_EXIST ); return 0; } @@ -1279,7 +1281,7 @@ ATOM get_class_info( HINSTANCE instance, const WCHAR *name, WNDCLASSEXW *info, info->lpszClassName = name; }
- if (name_str) init_class_name( name_str, name ); + if (name_str) init_class_name( name_str, class_name ); atom = class->atomName; release_class_ptr( class ); return atom;