e07e76371a86036b375fb02531b981d3badb88a4
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>
16 #include <undocuser.h>
18 static ATOM
_RegisterClass(LPCWSTR lpwszClassName
, HINSTANCE hInstance
, UINT style
, WNDPROC lpfnWndProc
)
20 WNDCLASSEXW wcex
= {sizeof(WNDCLASSEXW
), style
, lpfnWndProc
};
21 wcex
.lpszClassName
= lpwszClassName
;
22 wcex
.hInstance
= hInstance
;
23 return RegisterClassExW(&wcex
);
26 static ATOM
_GetClassAtom(LPCWSTR lpwszClassName
, HINSTANCE hInstance
)
28 WNDCLASSEXW wcex
= {sizeof(WNDCLASSEXW
)};
29 return (ATOM
)GetClassInfoExW(hInstance
, lpwszClassName
, &wcex
);
32 static WNDPROC
_GetWndproc(LPCWSTR lpwszClassName
, HINSTANCE hInstance
)
34 WNDCLASSEXW wcex
= {sizeof(WNDCLASSEXW
)};
35 BOOL ret
= GetClassInfoExW(hInstance
, lpwszClassName
, &wcex
);
36 return ret
? wcex
.lpfnWndProc
: NULL
;
39 static ATOM
_RegisterClassA(LPCSTR lpzClassName
, HINSTANCE hInstance
, UINT style
, WNDPROC lpfnWndProc
)
41 WNDCLASSEXA wcex
= {sizeof(WNDCLASSEX
), style
, lpfnWndProc
};
42 wcex
.lpszClassName
= lpzClassName
;
43 wcex
.hInstance
= hInstance
;
44 return RegisterClassExA(&wcex
);
47 static ATOM
_GetClassAtomA(LPCSTR lpszClassName
, HINSTANCE hInstance
)
49 WNDCLASSEXA wcex
= {sizeof(WNDCLASSEX
)};
50 return (ATOM
)GetClassInfoExA(hInstance
, lpszClassName
, &wcex
);
53 static WNDPROC
_GetWndprocA(LPCSTR lpszClassName
, HINSTANCE hInstance
)
55 WNDCLASSEXA wcex
= {sizeof(WNDCLASSEX
)};
56 BOOL ret
= GetClassInfoExA(hInstance
, lpszClassName
, &wcex
);
57 return ret
? wcex
.lpfnWndProc
: NULL
;
60 HANDLE
_CreateActCtxFromFile(LPCWSTR FileName
)
62 ACTCTXW ActCtx
= {sizeof(ACTCTX
)};
63 WCHAR buffer
[MAX_PATH
] , *separator
;
65 ok (GetModuleFileNameW(NULL
, buffer
, MAX_PATH
), "GetModuleFileName failed\n");
66 separator
= wcsrchr(buffer
, L
'\\');
68 wcscpy(separator
+ 1, FileName
);
70 ActCtx
.lpSource
= buffer
;
72 return CreateActCtxW(&ActCtx
);
75 VOID
TestGlobalClasses(VOID
)
77 HMODULE hmod
= GetModuleHandle(NULL
);
80 a
= _GetClassAtom(L
"TestClass1", hmod
);
81 b
= _RegisterClass(L
"TestClass1", hmod
, 0, DefWindowProcW
);
82 c
= _GetClassAtom(L
"TestClass1", hmod
);
83 UnregisterClass(L
"TestClass1", hmod
);
84 d
= _GetClassAtom(L
"TestClass1", hmod
);
91 a
= _GetClassAtom(L
"TestClass2", hmod
);
92 b
= _RegisterClass(L
"TestClass2", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
93 c
= _GetClassAtom(L
"TestClass2", hmod
);
94 UnregisterClass(L
"TestClass2", hmod
);
95 d
= _GetClassAtom(L
"TestClass2", hmod
);
102 a
= _RegisterClass(L
"TestClass3", hmod
, 0, DefWindowProcW
);
103 b
= _RegisterClass(L
"TestClass3", hmod
, 0, DefWindowProcW
);
104 c
= _RegisterClass(L
"TestClass3", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
105 UnregisterClass(L
"TestClass3", hmod
);
106 d
= _GetClassAtom(L
"TestClass3", hmod
);
112 a
= _RegisterClass(L
"TestClass4", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
113 b
= _RegisterClass(L
"TestClass4", hmod
, 0, DefWindowProcW
);
114 c
= _RegisterClass(L
"TestClass4", hmod
, 0, DefWindowProcW
);
115 UnregisterClass(L
"TestClass4", hmod
);
116 d
= _GetClassAtom(L
"TestClass4", hmod
);
117 UnregisterClass(L
"TestClass4", hmod
);
118 e
= _GetClassAtom(L
"TestClass4", hmod
);
125 a
= _GetClassAtom(L
"ComboBox", hmod
);
126 b
= _RegisterClass(L
"ComboBox", hmod
, 0, DefWindowProcW
);
127 c
= _RegisterClass(L
"ComboBox", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
128 UnregisterClass(L
"ComboBox", hmod
);
129 d
= _GetClassAtom(L
"ComboBox", hmod
);
130 UnregisterClass(L
"TestClass4", hmod
);
131 e
= _GetClassAtom(L
"TestClass4", hmod
);
138 a
= _GetClassAtom(L
"ScrollBar", hmod
);
139 UnregisterClass(L
"ScrollBar", hmod
);
140 b
= _GetClassAtom(L
"ScrollBar", hmod
);
141 c
= _RegisterClass(L
"ScrollBar", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
142 d
= _GetClassAtom(L
"ScrollBar", hmod
);
148 ok( a
== d
, "\n"); /* In Windows 10 the last 4 tests fail */
150 a
= _GetClassAtom(L
"ListBox", (HMODULE
)0xdead);
151 UnregisterClass(L
"ListBox", (HMODULE
)0xdead);
152 b
= _GetClassAtom(L
"ListBox", (HMODULE
)0xdead);
156 a
= _RegisterClass(L
"TestClass5", (HMODULE
)0xdead, CS_GLOBALCLASS
, DefWindowProcW
);
157 b
= _GetClassAtom(L
"TestClass5", hmod
);
158 UnregisterClass(L
"TestClass5", hmod
);
159 c
= _GetClassAtom(L
"TestClass5", (HMODULE
)0xdead);
160 d
= _GetClassAtom(L
"TestClass5", hmod
);
167 VOID
TestVersionedClasses(VOID
)
169 HMODULE hmod
= GetModuleHandle(NULL
);
171 ULONG_PTR cookie1
, cookie2
;
173 WNDPROC proc1
,proc2
,proc3
, proc4
, proc5
;
177 h1
= _CreateActCtxFromFile(L
"verclasstest1.manifest");
178 h2
= _CreateActCtxFromFile(L
"verclasstest2.manifest");
179 if (h1
== INVALID_HANDLE_VALUE
|| h2
== INVALID_HANDLE_VALUE
)
181 skip("Loading manifests failed. Skipping TestVersionedClasses\n");
185 a
= _RegisterClass(L
"VersionTestClass1", hmod
, 0, DefWindowProcA
);
186 proc1
= _GetWndproc(L
"VersionTestClass1", hmod
);
187 b
= _RegisterClass(L
"VersionTestClass1", hmod
, 0, DefWindowProcW
);
188 ActivateActCtx(h1
, &cookie1
);
189 proc2
= _GetWndproc(L
"VersionTestClass1", hmod
);
190 c
= _RegisterClass(L
"VersionTestClass1", hmod
, 0, DefWindowProcW
);
191 d
= _GetClassAtom(L
"VersionTestClass1", hmod
);
192 proc3
= _GetWndproc(L
"VersionTestClass1", hmod
);
193 proc4
= _GetWndproc((LPCWSTR
)(DWORD_PTR
)a
, hmod
);
194 DeactivateActCtx(0, cookie1
);
195 proc5
= _GetWndproc(L
"VersionTestClass1", hmod
);
202 ok (proc1
== DefWindowProcA
, "\n");
203 ok (proc2
== NULL
, "Got 0x%p, expected NULL\n", proc2
);
204 ok (proc3
== DefWindowProcW
, "Got 0x%p, expected 0x%p\n", proc3
, DefWindowProcW
);
205 ok (proc4
== DefWindowProcW
, "Got 0x%p, expected 0x%p\n", proc4
, DefWindowProcW
);
206 ok (proc5
== DefWindowProcA
, "\n");
208 a
= _GetClassAtom(L
"Button", hmod
);
209 b
= _RegisterClass(L
"Button", hmod
, CS_GLOBALCLASS
, DefWindowProcA
);
210 proc1
= _GetWndproc(L
"Button", (HMODULE
)0xdead);
211 ActivateActCtx(h2
, &cookie1
);
212 c
= _RegisterClass(L
"Button", hmod
, CS_GLOBALCLASS
, DefWindowProcA
);
213 proc2
= _GetWndproc(L
"Button", (HMODULE
)0xdead);
214 d
= _GetClassAtom(L
"3.3.3.3!Button", (HMODULE
)0xdead);
215 proc3
= _GetWndproc(L
"3.3.3.3!Button", (HMODULE
)0xdead);
222 ok( proc1
!= NULL
, "\n");
223 ok( proc1
!= DefWindowProcA
, "Got 0x%p, expected not 0x%p\n", proc1
, DefWindowProcA
);
224 ok( proc2
== DefWindowProcA
, "Got 0x%p, expected 0x%p\n", proc2
, DefWindowProcA
);
225 ok( proc3
== DefWindowProcA
, "Got 0x%p, expected 0x%p\n", proc3
, DefWindowProcA
);
227 a
= _RegisterClass(L
"VersionTestClass2", hmod
, CS_GLOBALCLASS
, DefWindowProcW
);
228 proc1
= _GetWndproc(L
"VersionTestClass2", (HMODULE
)0xdead);
229 b
= _RegisterClass(L
"VersionTestClass2", hmod
, 0, DefWindowProcA
);
230 proc2
= _GetWndproc(L
"VersionTestClass2", hmod
);
231 proc3
= _GetWndproc(L
"VersionTestClass2", (HMODULE
)0xdead);
235 ok (proc1
== DefWindowProcW
, "Got 0x%p, expected 0x%p\n", proc1
, DefWindowProcW
);
236 ok (proc2
== DefWindowProcA
, "Got 0x%p, expected 0x%p\n", proc2
, DefWindowProcA
);
237 ok (proc3
== DefWindowProcW
, "Got 0x%p, expected 0x%p\n", proc2
, DefWindowProcA
);
239 a
= _RegisterClass(L
"VersionTestClass3", hmod
, 0, DefWindowProcW
);
240 swprintf(buffer
, L
"#%d", a
);
241 proc1
= _GetWndproc((LPCWSTR
)(DWORD_PTR
)a
, hmod
);
242 proc2
= _GetWndproc(buffer
, hmod
);
244 ok (proc1
== DefWindowProcW
, "\n");
245 ok (proc2
== 0, "Got 0x%p for %S, expected 0\n", proc2
, buffer
);
246 DeactivateActCtx(0, cookie1
);
248 a
= _RegisterClass(L
"VersionTestClass3", hmod
, 0, DefWindowProcW
);
249 swprintf(buffer
, L
"#%d", a
);
250 proc1
= _GetWndproc((LPCWSTR
)(DWORD_PTR
)a
, hmod
);
251 proc2
= _GetWndproc(buffer
, hmod
);
253 ok (proc1
== DefWindowProcW
, "\n");
254 ok (proc2
== 0, "Got 0x%p for %S, expected 0\n", proc2
, buffer
);
256 ActivateActCtx(h2
, &cookie1
);
257 a
= _RegisterClassA("VersionTestClass7", hmod
, 0, DefWindowProcW
);
258 b
= _GetClassAtomA("VersionTestClass7", hmod
);
259 proc1
= _GetWndprocA("VersionTestClass7", hmod
);
260 proc2
= _GetWndprocA((LPCSTR
)(DWORD_PTR
)a
, hmod
);
264 ok (proc1
== DefWindowProcW
, "\n");
265 ok (proc2
== DefWindowProcW
, "\n");
267 DeactivateActCtx(0, cookie1
);
269 proc1
= _GetWndproc(L
"Button", 0);
270 ActivateActCtx(h2
, &cookie1
);
271 ActivateActCtx(h1
, &cookie2
);
272 proc2
= _GetWndproc(L
"Button", 0);
273 DeactivateActCtx(0, cookie2
);
274 ActivateActCtx(0, &cookie2
);
275 proc3
= _GetWndproc(L
"Button", 0);
276 DeactivateActCtx(0, cookie2
);
277 DeactivateActCtx(0, cookie1
);
278 ok (proc1
!= 0, "\n");
279 ok (proc2
!= 0, "\n");
280 ok (proc4
!= 0, "\n");
281 ok (proc1
== proc2
, "\n");
282 ok (proc1
== proc3
, "\n");
286 START_TEST(RegisterClassEx
)
289 TestVersionedClasses();