Do not use GlobalFindAtom with atom handles in CreateWindow* functions.
diff --git a/windows/win.c b/windows/win.c
index 516bb80..52d47cc 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -690,9 +690,7 @@
/* Find the window class */
if (!(classPtr = CLASS_FindClassByAtom( classAtom, win32?cs->hInstance:GetExePtr(cs->hInstance) )))
{
- char buffer[256];
- GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) );
- WARN("Bad class '%s'\n", buffer );
+ WARN("Bad class '%s'\n", cs->lpszClass );
return 0;
}
@@ -1040,10 +1038,23 @@
/* Find the class atom */
- if (!(classAtom = GlobalFindAtomA( className )))
+ if (HIWORD(className))
{
- ERR( "bad class name %s\n", debugres_a(className) );
- return 0;
+ if (!(classAtom = GlobalFindAtomA( className )))
+ {
+ ERR( "bad class name %s\n", debugres_a(className) );
+ return 0;
+ }
+ }
+ else
+ {
+ classAtom = LOWORD(className);
+ if (!GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) ))
+ {
+ ERR( "bad atom %x\n", classAtom);
+ return 0;
+ }
+ className = buffer;
}
/* Fix the coordinates */
@@ -1064,12 +1075,6 @@
cs.lpszClass = className;
cs.dwExStyle = exStyle;
- /* make sure lpszClass is a string */
- if (!HIWORD(cs.lpszClass))
- {
- GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) );
- cs.lpszClass = buffer;
- }
return WIN_CreateWindowEx( &cs, classAtom, FALSE, FALSE );
}
@@ -1092,12 +1097,26 @@
if(exStyle & WS_EX_MDICHILD)
return MDI_CreateMDIWindowA(className, windowName, style, x, y, width, height, parent, instance, (LPARAM)data);
+
/* Find the class atom */
- if (!(classAtom = GlobalFindAtomA( className )))
+ if (HIWORD(className))
{
- ERR( "bad class name %s\n", debugres_a(className) );
- return 0;
+ if (!(classAtom = GlobalFindAtomA( className )))
+ {
+ ERR( "bad class name %s\n", debugres_a(className) );
+ return 0;
+ }
+ }
+ else
+ {
+ classAtom = LOWORD(className);
+ if (!GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) ))
+ {
+ ERR( "bad atom %x\n", classAtom);
+ return 0;
+ }
+ className = buffer;
}
/* Create the window */
@@ -1115,12 +1134,6 @@
cs.lpszClass = className;
cs.dwExStyle = exStyle;
- /* make sure lpszClass is a string */
- if (!HIWORD(cs.lpszClass))
- {
- GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) );
- cs.lpszClass = buffer;
- }
return WIN_CreateWindowEx( &cs, classAtom, TRUE, FALSE );
}
@@ -1146,10 +1159,23 @@
/* Find the class atom */
- if (!(classAtom = GlobalFindAtomW( className )))
+ if (HIWORD(className))
{
- ERR( "bad class name %s\n", debugres_w(className) );
- return 0;
+ if (!(classAtom = GlobalFindAtomW( className )))
+ {
+ ERR( "bad class name %s\n", debugres_w(className) );
+ return 0;
+ }
+ }
+ else
+ {
+ classAtom = LOWORD(className);
+ if (!GlobalGetAtomNameW( classAtom, buffer, sizeof(buffer)/sizeof(WCHAR) ))
+ {
+ ERR( "bad atom %x\n", classAtom);
+ return 0;
+ }
+ className = buffer;
}
/* Create the window */
@@ -1167,13 +1193,6 @@
cs.lpszClass = className;
cs.dwExStyle = exStyle;
- /* make sure lpszClass is a string */
- if (!HIWORD(cs.lpszClass))
- {
- GlobalGetAtomNameW( classAtom, buffer, sizeof(buffer)/sizeof(WCHAR) );
- cs.lpszClass = buffer;
- }
-
/* Note: we rely on the fact that CREATESTRUCT32A and */
/* CREATESTRUCT32W have the same layout. */
return WIN_CreateWindowEx( (CREATESTRUCTA *)&cs, classAtom, TRUE, TRUE );