[PATCH v2] user32: When registering redirected class use correct base class name

Fabian Maurer dark.shadow4 at web.de
Thu Aug 23 17:44:25 CDT 2018


Based on a patch by Nikolay Sivov

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45689
Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
---
 dlls/comctl32/tests/combo.c | 15 +++++++++++++++
 dlls/user32/class.c         | 14 ++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/dlls/comctl32/tests/combo.c b/dlls/comctl32/tests/combo.c
index 923d826b30..065ce1a620 100644
--- a/dlls/comctl32/tests/combo.c
+++ b/dlls/comctl32/tests/combo.c
@@ -1254,6 +1254,20 @@ static void test_combo_dropdown_size(DWORD style)
     }
 }
 
+static void test_combo(void)
+{
+    HWND handle_combo;
+    char classname[10];
+
+    handle_combo = create_combobox(CBS_DROPDOWNLIST);
+
+    GetClassNameA(handle_combo, classname, sizeof(classname));
+
+    ok(strcmp(classname, "ComboBox") == 0, "Got wrong classname: %s\n", classname);
+
+    DestroyWindow(handle_combo);
+}
+
 START_TEST(combo)
 {
     ULONG_PTR ctx_cookie;
@@ -1281,6 +1295,7 @@ START_TEST(combo)
     }
 
     /* ComboBox control tests. */
+    test_combo();
     test_combo_WS_VSCROLL();
     test_combo_setfont(CBS_DROPDOWN);
     test_combo_setfont(CBS_DROPDOWNLIST);
diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index 07d36f05d7..b8309025ca 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -664,6 +664,7 @@ ATOM WINAPI RegisterClassExA( const WNDCLASSEXA* wc )
 {
     const WCHAR *classname = NULL;
     WCHAR name[MAX_ATOM_LEN + 1];
+    WCHAR classname_versioned[MAX_ATOM_LEN + 1];
     ATOM atom;
     CLASS *classPtr;
     HINSTANCE instance;
@@ -683,6 +684,12 @@ ATOM WINAPI RegisterClassExA( const WNDCLASSEXA* wc )
         UINT basename_offset;
         if (!MultiByteToWideChar( CP_ACP, 0, wc->lpszClassName, -1, name, MAX_ATOM_LEN + 1 )) return 0;
         classname = CLASS_GetVersionedName( name, &basename_offset, FALSE );
+        if (basename_offset) /* Make sure redirected classes have the same name as their base class */
+        {
+            strcpyW(classname_versioned, classname);
+            strcpyW(&classname_versioned[basename_offset], name);
+            classname = classname_versioned;
+        }
         classPtr = CLASS_RegisterClass( classname, basename_offset, instance, !(wc->style & CS_GLOBALCLASS),
                                         wc->style, wc->cbClsExtra, wc->cbWndExtra );
     }
@@ -721,6 +728,7 @@ ATOM WINAPI RegisterClassExA( const WNDCLASSEXA* wc )
 ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc )
 {
     const WCHAR *classname;
+    WCHAR classname_versioned[MAX_ATOM_LEN + 1];
     UINT basename_offset;
     ATOM atom;
     CLASS *classPtr;
@@ -737,6 +745,12 @@ ATOM WINAPI RegisterClassExW( const WNDCLASSEXW* wc )
     if (!(instance = wc->hInstance)) instance = GetModuleHandleW( NULL );
 
     classname = CLASS_GetVersionedName( wc->lpszClassName, &basename_offset, FALSE );
+    if (basename_offset) /* Make sure redirected classes have the same name as their base class */
+    {
+        strcpyW(classname_versioned, classname);
+        strcpyW(&classname_versioned[basename_offset], wc->lpszClassName);
+        classname = classname_versioned;
+    }
     if (!(classPtr = CLASS_RegisterClass( classname, basename_offset, instance, !(wc->style & CS_GLOBALCLASS),
                                           wc->style, wc->cbClsExtra, wc->cbWndExtra )))
         return 0;
-- 
2.18.0




More information about the wine-devel mailing list