2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for RegisterClassEx
5 * PROGRAMMERS: Giannis Adamopoulos
9 #define WIN32_NO_STATUS
10 #include <ndk/rtlfuncs.h>
15 #include <undocuser.h>
17 static ATOM
_RegisterClass(LPCWSTR lpwszClassName
, HINSTANCE hInstance
, UINT style
, WNDPROC lpfnWndProc
)
19 WNDCLASSEXW wcex
= {sizeof(WNDCLASSEXW
), style
, lpfnWndProc
};
20 wcex
.lpszClassName
= lpwszClassName
;
21 wcex
.hInstance
= hInstance
;
22 return RegisterClassExW(&wcex
);
25 static ATOM
_GetClassAtom(LPCWSTR lpwszClassName
, HINSTANCE hInstance
)
27 WNDCLASSEXW wcex
= {sizeof(WNDCLASSEXW
)};
28 return (ATOM
)GetClassInfoEx(hInstance
, lpwszClassName
, &wcex
);
31 static WNDPROC
_GetWndproc(LPCWSTR lpwszClassName
, HINSTANCE hInstance
)
33 WNDCLASSEXW wcex
= {sizeof(WNDCLASSEXW
)};
34 GetClassInfoEx(hInstance
, lpwszClassName
, &wcex
);
35 return wcex
.lpfnWndProc
;
38 HANDLE
_CreateActCtxFromFile(LPCWSTR FileName
)
40 ACTCTXW ActCtx
= {sizeof(ACTCTX
)};
41 WCHAR buffer
[MAX_PATH
] , *separator
;
43 ok (GetModuleFileNameW(NULL
, buffer
, MAX_PATH
), "GetModuleFileName failed\n");
44 separator
= wcsrchr(buffer
, L
'\\');
46 wcscpy(separator
+ 1, FileName
);
48 ActCtx
.lpSource
= buffer
;
50 return CreateActCtxW(&ActCtx
);
53 VOID
TestGlobalClasses(VOID
)
55 HMODULE hmod
= GetModuleHandle(NULL
);
58 a
= _GetClassAtom(L
"TestClass1", hmod
);
59 b
= _RegisterClass(L
"TestClass1", hmod
, 0, DefWindowProcW
);
60 c
= _GetClassAtom(L
"TestClass1", hmod
);
61 UnregisterClass(L
"TestClass1", hmod
);
62 d
= _GetClassAtom(L
"TestClass1", hmod
);
69 a
= _GetClassAtom(L
"TestClass2", hmod
);
70 b
= _RegisterClass(L
"TestClass2", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
71 c
= _GetClassAtom(L
"TestClass2", hmod
);
72 UnregisterClass(L
"TestClass2", hmod
);
73 d
= _GetClassAtom(L
"TestClass2", hmod
);
80 a
= _RegisterClass(L
"TestClass3", hmod
, 0, DefWindowProcW
);
81 b
= _RegisterClass(L
"TestClass3", hmod
, 0, DefWindowProcW
);
82 c
= _RegisterClass(L
"TestClass3", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
83 UnregisterClass(L
"TestClass3", hmod
);
84 d
= _GetClassAtom(L
"TestClass3", hmod
);
90 a
= _RegisterClass(L
"TestClass4", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
91 b
= _RegisterClass(L
"TestClass4", hmod
, 0, DefWindowProcW
);
92 c
= _RegisterClass(L
"TestClass4", hmod
, 0, DefWindowProcW
);
93 UnregisterClass(L
"TestClass4", hmod
);
94 d
= _GetClassAtom(L
"TestClass4", hmod
);
95 UnregisterClass(L
"TestClass4", hmod
);
96 e
= _GetClassAtom(L
"TestClass4", hmod
);
103 a
= _GetClassAtom(L
"ComboBox", hmod
);
104 b
= _RegisterClass(L
"ComboBox", hmod
, 0, DefWindowProcW
);
105 c
= _RegisterClass(L
"ComboBox", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
106 UnregisterClass(L
"ComboBox", hmod
);
107 d
= _GetClassAtom(L
"ComboBox", hmod
);
108 UnregisterClass(L
"TestClass4", hmod
);
109 e
= _GetClassAtom(L
"TestClass4", hmod
);
116 a
= _GetClassAtom(L
"ScrollBar", hmod
);
117 UnregisterClass(L
"ScrollBar", hmod
);
118 b
= _GetClassAtom(L
"ScrollBar", hmod
);
119 c
= _RegisterClass(L
"ScrollBar", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
120 d
= _GetClassAtom(L
"ScrollBar", hmod
);
126 ok( a
== d
, "\n"); /* In Windows 10 the last 4 tests fail */
128 a
= _GetClassAtom(L
"ListBox", (HMODULE
)0xdead);
129 UnregisterClass(L
"ListBox", (HMODULE
)0xdead);
130 b
= _GetClassAtom(L
"ListBox", (HMODULE
)0xdead);
134 a
= _RegisterClass(L
"TestClass5", (HMODULE
)0xdead, CS_GLOBALCLASS
, DefWindowProcW
);
135 b
= _GetClassAtom(L
"TestClass5", hmod
);
136 UnregisterClass(L
"TestClass5", hmod
);
137 c
= _GetClassAtom(L
"TestClass5", (HMODULE
)0xdead);
138 d
= _GetClassAtom(L
"TestClass5", hmod
);
145 VOID
TestVersionedClasses(VOID
)
147 HMODULE hmod
= GetModuleHandle(NULL
);
151 WNDPROC proc1
,proc2
,proc3
, proc4
, proc5
;
153 h1
= _CreateActCtxFromFile(L
"verclasstest1.manifest");
154 h2
= _CreateActCtxFromFile(L
"verclasstest2.manifest");
155 if (h1
== INVALID_HANDLE_VALUE
|| h2
== INVALID_HANDLE_VALUE
)
157 skip("Loading manifests failed. Skipping TestVersionedClasses\n");
161 a
= _RegisterClass(L
"VersionTestClass1", hmod
, 0, DefWindowProcA
);
162 proc1
= _GetWndproc(L
"VersionTestClass1", hmod
);
163 b
= _RegisterClass(L
"VersionTestClass1", hmod
, 0, DefWindowProcW
);
164 ActivateActCtx(h1
, &cookie1
);
165 proc2
= _GetWndproc(L
"VersionTestClass1", hmod
);
166 c
= _RegisterClass(L
"VersionTestClass1", hmod
, 0, DefWindowProcW
);
167 proc3
= _GetWndproc(L
"VersionTestClass1", hmod
);
168 proc4
= _GetWndproc((LPCWSTR
)(DWORD_PTR
)a
, hmod
);
169 DeactivateActCtx(0, cookie1
);
170 proc5
= _GetWndproc(L
"VersionTestClass1", hmod
);
175 ok (proc1
== DefWindowProcA
, "\n");
176 ok (proc2
== NULL
, "\n");
177 ok (proc3
== DefWindowProcW
, "\n");
178 ok (proc4
== DefWindowProcW
, "\n");
179 ok (proc5
== DefWindowProcA
, "\n");
181 a
= _GetClassAtom(L
"Button", hmod
);
182 b
= _RegisterClass(L
"Button", hmod
, CS_GLOBALCLASS
, DefWindowProcA
);
183 proc1
= _GetWndproc(L
"Button", (HMODULE
)0xdead);
184 ActivateActCtx(h2
, &cookie1
);
185 c
= _RegisterClass(L
"Button", hmod
, CS_GLOBALCLASS
, DefWindowProcA
);
186 proc2
= _GetWndproc(L
"Button", (HMODULE
)0xdead);
191 ok( proc1
!= NULL
, "\n");
192 ok( proc1
!= proc2
, "\n");
193 ok( proc2
== DefWindowProcA
, "\n");
195 a
= _RegisterClass(L
"VersionTestClass2", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
196 proc1
= _GetWndproc(L
"VersionTestClass2", (HMODULE
)0xdead);
197 b
= _RegisterClass(L
"VersionTestClass2", hmod
, 0, DefWindowProcA
);
198 proc2
= _GetWndproc(L
"VersionTestClass2", hmod
);
202 ok (proc1
== DefWindowProcW
, "\n");
203 ok (proc2
== DefWindowProcA
, "\n");
208 START_TEST(RegisterClassEx
)
211 TestVersionedClasses();