- Bug 1450: Patch by Thomas Weidenmueller "Some window class fixes"
authorAleksey Bragin <aleksey@reactos.org>
Wed, 3 May 2006 10:48:38 +0000 (10:48 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Wed, 3 May 2006 10:48:38 +0000 (10:48 +0000)
This patch makes registering the "Abiword" window class succeed. However, Abiword now crashes with a stack overflow recursively delivering the WM_NOTIFYFORMAT message to a subclassed rebar control...

svn path=/trunk/; revision=21781

reactos/dll/win32/user32/windows/class.c
reactos/subsystems/win32/win32k/ntuser/class.c
reactos/subsystems/win32/win32k/ntuser/window.c

index f4a3007..0b7686e 100644 (file)
@@ -553,18 +553,22 @@ RegisterClassExA(CONST WNDCLASSEXA *lpwcx)
       WndClass.hIconSm = CreateSmallIcon(WndClass.hIcon);
    }
 
-   if (lpwcx->lpszMenuName != NULL)
+   if (WndClass.lpszMenuName != NULL)
    {
-      if (HIWORD(lpwcx->lpszMenuName))
+      if (!IS_INTRESOURCE(WndClass.lpszMenuName))
       {
-         RtlCreateUnicodeStringFromAsciiz(&MenuName, WndClass.lpszMenuName);
+         if (WndClass.lpszMenuName[0])
+         {
+             RtlCreateUnicodeStringFromAsciiz(&MenuName, WndClass.lpszMenuName);
+         }
       }
       else
       {
          MenuName.Buffer = (LPWSTR)WndClass.lpszMenuName;
       }
 
-      hMenu = LoadMenuA(WndClass.hInstance, lpwcx->lpszMenuName);
+      if (MenuName.Buffer != NULL)
+         hMenu = LoadMenuA(WndClass.hInstance, WndClass.lpszMenuName);
    }
  
    if (IS_ATOM(WndClass.lpszClassName))
@@ -585,7 +589,7 @@ RegisterClassExA(CONST WNDCLASSEXA *lpwcx)
                                 REGISTERCLASS_ANSI,
                                 hMenu);
 
-   if (!IS_ATOM(WndClass.lpszMenuName))
+   if (!IS_INTRESOURCE(WndClass.lpszMenuName))
       RtlFreeUnicodeString(&MenuName);
    if (!IS_ATOM(WndClass.lpszClassName))
       RtlFreeUnicodeString(&ClassName);
@@ -637,17 +641,22 @@ RegisterClassExW(CONST WNDCLASSEXW *lpwcx)
       WndClass.hIconSm = CreateSmallIcon(WndClass.hIcon);
    }
 
-   if (lpwcx->lpszMenuName != NULL)
+   if (WndClass.lpszMenuName != NULL)
    {
-      if (HIWORD(lpwcx->lpszMenuName))
+      if (!IS_INTRESOURCE(WndClass.lpszMenuName))
       {
-         RtlInitUnicodeString(&MenuName, WndClass.lpszMenuName);
+         if (WndClass.lpszMenuName[0])
+         {
+            RtlInitUnicodeString(&MenuName, WndClass.lpszMenuName);
+         }
       }
       else
       {
          MenuName.Buffer = (LPWSTR)WndClass.lpszMenuName;
       }
-      hMenu = LoadMenuW(WndClass.hInstance, lpwcx->lpszMenuName);
+
+      if (MenuName.Buffer != NULL)
+         hMenu = LoadMenuW(WndClass.hInstance, WndClass.lpszMenuName);
    }
 
    if (IS_ATOM(WndClass.lpszClassName))
index afa9d2e..92bc410 100644 (file)
@@ -1432,6 +1432,8 @@ UserUnregisterClass(IN PUNICODE_STRING ClassName,
     /* unlink the class */
     *Link = Class->Next;
 
+    IntDeregisterClassAtom(Class->Atom);
+
     /* finally free the resources */
     IntDestroyClass(Class);
     return TRUE;
index 2fec86b..9d73674 100644 (file)
@@ -1491,7 +1491,7 @@ co_IntCreateWindowEx(DWORD dwExStyle,
       }
       else
       {
-         DPRINT1("Class %wZ not found\n", ClassName);
+         DPRINT1("Class \"%wZ\" not found\n", ClassName);
       }
 
       SetLastWin32Error(ERROR_CANNOT_FIND_WND_CLASS);
@@ -2073,7 +2073,7 @@ NtUserCreateWindowEx(DWORD dwExStyle,
          RETURN( NULL);
       }
    }
-   else if (! IS_INTRESOURCE(ClassName.Buffer))
+   else if (! IS_ATOM(ClassName.Buffer))
    {
        SetLastWin32Error(ERROR_INVALID_PARAMETER);
        return NULL;