blob: 1a97140cf1b8a80b7ab737eead688ad9083f3829 [file] [log] [blame]
Alexandre Julliard401710d1993-09-04 10:09:32 +00001/*
2 * Window classes functions
3 *
4 * Copyright 1993 Alexandre Julliard
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +00005 */
Alexandre Julliard401710d1993-09-04 10:09:32 +00006
Alexandre Julliard8d24ae61994-04-05 21:42:43 +00007#include <stdlib.h>
8#include <stdio.h>
9#include <string.h>
Alexandre Julliard401710d1993-09-04 10:09:32 +000010#include "class.h"
11#include "user.h"
12#include "win.h"
Alexandre Julliard5f721f81994-01-04 20:14:34 +000013#include "dce.h"
Alexandre Julliarde2991ea1995-07-29 13:09:43 +000014#include "atom.h"
Alexandre Julliard808cb041995-08-17 17:11:36 +000015#include "ldt.h"
Alexandre Julliarde2abbb11995-03-19 17:39:39 +000016#include "toolhelp.h"
Alexandre Julliardaca05781994-10-17 18:12:41 +000017#include "stddebug.h"
Alexandre Julliardaca05781994-10-17 18:12:41 +000018#include "debug.h"
Alexandre Julliard8d24ae61994-04-05 21:42:43 +000019
Alexandre Julliard401710d1993-09-04 10:09:32 +000020
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000021static CLASS *firstClass = NULL;
Alexandre Julliard401710d1993-09-04 10:09:32 +000022
23
24/***********************************************************************
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000025 * CLASS_DumpClass
26 *
27 * Dump the content of a class structure to stderr.
28 */
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000029void CLASS_DumpClass( CLASS *ptr )
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000030{
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000031 char className[80];
32 int i;
33
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000034 if (((CLASS *)USER_HEAP_LIN_ADDR(ptr->self) != ptr) ||
35 (ptr->wMagic != CLASS_MAGIC))
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000036 {
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000037 fprintf( stderr, "%p is not a class\n", ptr );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000038 return;
39 }
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000040
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000041 GlobalGetAtomName( ptr->atomName, className, sizeof(className) );
42
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000043 fprintf( stderr, "Class %p:\n", ptr );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000044 fprintf( stderr,
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000045 "next=%p name=%04x '%s' style=%04x wndProc=%08lx\n"
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000046 "inst=%04x hdce=%04x icon=%04x cursor=%04x bkgnd=%04x\n"
47 "clsExtra=%d winExtra=%d #windows=%d\n",
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000048 ptr->next, ptr->atomName, className, ptr->wc.style,
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000049 (DWORD)ptr->wc.lpfnWndProc, ptr->wc.hInstance, ptr->hdce,
50 ptr->wc.hIcon, ptr->wc.hCursor, ptr->wc.hbrBackground,
51 ptr->wc.cbClsExtra, ptr->wc.cbWndExtra, ptr->cWindows );
52 if (ptr->wc.cbClsExtra)
53 {
54 fprintf( stderr, "extra bytes:" );
55 for (i = 0; i < ptr->wc.cbClsExtra; i++)
56 fprintf( stderr, " %02x", *((BYTE *)ptr->wExtra+i) );
57 fprintf( stderr, "\n" );
58 }
59 fprintf( stderr, "\n" );
60}
61
62
63/***********************************************************************
64 * CLASS_WalkClasses
65 *
66 * Walk the class list and print each class on stderr.
67 */
68void CLASS_WalkClasses(void)
69{
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000070 CLASS *ptr;
71 char className[80];
72
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000073 fprintf( stderr, " Class Name Style WndProc\n" );
74 for (ptr = firstClass; ptr; ptr = ptr->next)
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000075 {
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000076 GlobalGetAtomName( ptr->atomName, className, sizeof(className) );
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000077 fprintf( stderr, "%08lx %-20.20s %04x %08lx\n", (DWORD)ptr, className,
78 ptr->wc.style, (DWORD)ptr->wc.lpfnWndProc );
Alexandre Julliardb817f4f1996-03-14 18:08:34 +000079 }
80 fprintf( stderr, "\n" );
81}
82
83
84/***********************************************************************
Alexandre Julliard2ace16a1996-04-28 15:09:19 +000085 * CLASS_FreeClass
86 *
87 * Free a class structure.
88 */
89static void CLASS_FreeClass( CLASS *classPtr )
90{
91 CLASS **ppClass;
92
93 /* Remove the class from the linked list */
94
95 for (ppClass = &firstClass; *ppClass; ppClass = &(*ppClass)->next)
96 if (*ppClass == classPtr) break;
97 if (!*ppClass)
98 {
99 fprintf(stderr, "ERROR: Class list corrupted\n" );
100 return;
101 }
102 *ppClass = classPtr->next;
103
104 /* Delete the class */
105
106 if (classPtr->hdce) DCE_FreeDCE( classPtr->hdce );
107 if (classPtr->wc.hbrBackground) DeleteObject( classPtr->wc.hbrBackground );
108 GlobalDeleteAtom( classPtr->atomName );
109 if (HIWORD(classPtr->wc.lpszMenuName))
110 USER_HEAP_FREE( (HANDLE)classPtr->wc.lpszMenuName );
111 USER_HEAP_FREE( classPtr->self );
112}
113
114
115/***********************************************************************
116 * CLASS_FreeModuleClasses
117 */
118void CLASS_FreeModuleClasses( HMODULE hModule )
119{
120 CLASS *ptr, *next;
121
122 for (ptr = firstClass; ptr; ptr = next)
123 {
124 next = ptr->next;
125 if (ptr->wc.hInstance == hModule) CLASS_FreeClass( ptr );
126 }
127}
128
129
130/***********************************************************************
Alexandre Julliard401710d1993-09-04 10:09:32 +0000131 * CLASS_FindClassByName
132 *
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000133 * Return a pointer to the class.
Alexandre Julliard401710d1993-09-04 10:09:32 +0000134 */
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000135CLASS *CLASS_FindClassByName( SEGPTR name, HINSTANCE hinstance )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000136{
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000137 ATOM atom;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000138 CLASS * class;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000139
Alexandre Julliardb7258be1995-09-01 15:57:28 +0000140 if (!(atom = GlobalFindAtom( name ))) return 0;
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000141
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000142 /* First search task-specific classes */
143
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000144 for (class = firstClass; (class); class = class->next)
Alexandre Julliard401710d1993-09-04 10:09:32 +0000145 {
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000146 if (class->wc.style & CS_GLOBALCLASS) continue;
147 if ((class->atomName == atom) &&
148 ((hinstance==(HINSTANCE)0xffff) ||
149 (hinstance == class->wc.hInstance))) return class;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000150 }
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000151
152 /* Then search global classes */
153
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000154 for (class = firstClass; (class); class = class->next)
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000155 {
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000156 if (!(class->wc.style & CS_GLOBALCLASS)) continue;
157 if (class->atomName == atom) return class;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000158 }
159
Alexandre Julliard401710d1993-09-04 10:09:32 +0000160 return 0;
161}
162
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000163
Alexandre Julliard401710d1993-09-04 10:09:32 +0000164/***********************************************************************
Alexandre Julliard401710d1993-09-04 10:09:32 +0000165 * RegisterClass (USER.57)
166 */
167ATOM RegisterClass( LPWNDCLASS class )
168{
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000169 CLASS * newClass, * prevClass;
170 HCLASS handle;
Alexandre Julliard6b81b391994-07-07 16:23:58 +0000171 int classExtra;
172
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000173 dprintf_class( stddeb, "RegisterClass: wndproc=%08lx hinst=%04x name='%s' background %04x\n",
Alexandre Julliard808cb041995-08-17 17:11:36 +0000174 (DWORD)class->lpfnWndProc, class->hInstance,
175 HIWORD(class->lpszClassName) ?
176 (char *)PTR_SEG_TO_LIN(class->lpszClassName) : "(int)",
177 class->hbrBackground );
178 dprintf_class(stddeb," style=%04x clsExtra=%d winExtra=%d\n",
179 class->style, class->cbClsExtra, class->cbWndExtra );
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000180
181 /* Window classes are owned by modules, not instances */
182 class->hInstance = GetExePtr( class->hInstance );
183
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000184 /* Check if a class with this name already exists */
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000185 prevClass = CLASS_FindClassByName( class->lpszClassName, class->hInstance);
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000186 if (prevClass)
187 {
188 /* Class can be created only if it is local and */
189 /* if the class with the same name is global. */
190
191 if (class->style & CS_GLOBALCLASS) return 0;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000192 if (!(prevClass->wc.style & CS_GLOBALCLASS)) return 0;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000193 }
194
195 /* Create class */
196
Alexandre Julliard6b81b391994-07-07 16:23:58 +0000197 classExtra = (class->cbClsExtra < 0) ? 0 : class->cbClsExtra;
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000198 handle = USER_HEAP_ALLOC( sizeof(CLASS) + classExtra );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000199 if (!handle) return 0;
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000200 newClass = (CLASS *) USER_HEAP_LIN_ADDR( handle );
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000201 newClass->self = handle;
202 newClass->next = firstClass;
Alexandre Julliard6b81b391994-07-07 16:23:58 +0000203 newClass->wMagic = CLASS_MAGIC;
204 newClass->cWindows = 0;
205 newClass->wc = *class;
206 newClass->wc.cbWndExtra = (class->cbWndExtra < 0) ? 0 : class->cbWndExtra;
207 newClass->wc.cbClsExtra = classExtra;
Alexandre Julliardf0b23541993-09-29 12:21:49 +0000208
Alexandre Julliardb7258be1995-09-01 15:57:28 +0000209 newClass->atomName = GlobalAddAtom( class->lpszClassName );
Alexandre Julliard808cb041995-08-17 17:11:36 +0000210 newClass->wc.lpszClassName = 0;
Alexandre Julliardf0b23541993-09-29 12:21:49 +0000211
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000212 if (newClass->wc.style & CS_CLASSDC)
213 newClass->hdce = DCE_AllocDCE( DCE_CLASS_DC );
214 else newClass->hdce = 0;
215
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000216 /* Make a copy of the menu name (only if it is a string) */
217
Alexandre Julliard808cb041995-08-17 17:11:36 +0000218 if (HIWORD(class->lpszMenuName))
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000219 {
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000220 char *menuname = PTR_SEG_TO_LIN( class->lpszMenuName );
221 HANDLE hname = USER_HEAP_ALLOC( strlen(menuname)+1 );
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000222 if (hname)
223 {
Alexandre Julliardaf0bae51995-10-03 17:06:08 +0000224 newClass->wc.lpszMenuName = (SEGPTR)USER_HEAP_SEG_ADDR( hname );
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000225 strcpy( USER_HEAP_LIN_ADDR( hname ), menuname );
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000226 }
227 }
228
Alexandre Julliard6b81b391994-07-07 16:23:58 +0000229 if (classExtra) memset( newClass->wExtra, 0, classExtra );
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000230 firstClass = newClass;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000231 return newClass->atomName;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000232}
233
234
235/***********************************************************************
236 * UnregisterClass (USER.403)
237 */
Alexandre Julliard808cb041995-08-17 17:11:36 +0000238BOOL UnregisterClass( SEGPTR className, HANDLE hinstance )
Alexandre Julliard401710d1993-09-04 10:09:32 +0000239{
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000240 CLASS *classPtr;
241
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000242 hinstance = GetExePtr( hinstance );
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000243
Alexandre Julliard401710d1993-09-04 10:09:32 +0000244 /* Check if we can remove this class */
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000245 if (!(classPtr = CLASS_FindClassByName( className, hinstance )))
246 return FALSE;
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000247 if ((classPtr->wc.hInstance != hinstance) || (classPtr->cWindows > 0))
Alexandre Julliard401710d1993-09-04 10:09:32 +0000248 return FALSE;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000249 CLASS_FreeClass( classPtr );
Alexandre Julliard401710d1993-09-04 10:09:32 +0000250 return TRUE;
251}
252
253
254/***********************************************************************
255 * GetClassWord (USER.129)
256 */
257WORD GetClassWord( HWND hwnd, short offset )
258{
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000259 WND * wndPtr;
260
261 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
262 if (offset >= 0)
263 return *(WORD *)(((char *)wndPtr->class->wExtra) + offset);
264 switch(offset)
265 {
266 case GCW_HBRBACKGROUND: return wndPtr->class->wc.hbrBackground;
267 case GCW_HCURSOR: return wndPtr->class->wc.hCursor;
268 case GCW_HICON: return wndPtr->class->wc.hIcon;
269 case GCW_HMODULE: return wndPtr->class->wc.hInstance;
270 case GCW_CBWNDEXTRA: return wndPtr->class->wc.cbWndExtra;
271 case GCW_CBCLSEXTRA: return wndPtr->class->wc.cbClsExtra;
272 case GCW_STYLE: return wndPtr->class->wc.style;
273 case GCW_ATOM: return wndPtr->class->atomName;
274 }
275 fprintf(stderr, "Warning: invalid offset %d for GetClassWord()\n", offset);
276 return 0;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000277}
278
279
280/***********************************************************************
281 * SetClassWord (USER.130)
282 */
283WORD SetClassWord( HWND hwnd, short offset, WORD newval )
284{
Alexandre Julliard401710d1993-09-04 10:09:32 +0000285 WND * wndPtr;
Alexandre Julliardf0b23541993-09-29 12:21:49 +0000286 WORD *ptr, retval = 0;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000287
288 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000289 if (offset >= 0) ptr = (WORD *)(((char *)wndPtr->class->wExtra) + offset);
290 else switch(offset)
291 {
292 case GCW_HBRBACKGROUND: ptr = &wndPtr->class->wc.hbrBackground; break;
293 case GCW_HCURSOR: ptr = &wndPtr->class->wc.hCursor; break;
294 case GCW_HICON: ptr = &wndPtr->class->wc.hIcon; break;
295 case GCW_HMODULE: ptr = &wndPtr->class->wc.hInstance; break;
296 case GCW_CBWNDEXTRA: ptr = &wndPtr->class->wc.cbWndExtra; break;
297 case GCW_CBCLSEXTRA: ptr = &wndPtr->class->wc.cbClsExtra; break;
298 case GCW_STYLE: ptr = &wndPtr->class->wc.style; break;
299 case GCW_ATOM: ptr = &wndPtr->class->atomName; break;
300 default:
301 fprintf( stderr, "Warning: invalid offset %d for SetClassWord()\n",
302 offset);
303 return 0;
304 }
Alexandre Julliardf0b23541993-09-29 12:21:49 +0000305 retval = *ptr;
306 *ptr = newval;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000307 return retval;
308}
309
310
311/***********************************************************************
312 * GetClassLong (USER.131)
313 */
314LONG GetClassLong( HWND hwnd, short offset )
315{
Alexandre Julliard401710d1993-09-04 10:09:32 +0000316 WND * wndPtr;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000317
318 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000319 if (offset >= 0)
320 return *(WORD *)(((char *)wndPtr->class->wExtra) + offset);
321 switch(offset)
322 {
323 case GCL_MENUNAME: return (LONG)wndPtr->class->wc.lpszMenuName;
324 case GCL_WNDPROC: return (LONG)wndPtr->class->wc.lpfnWndProc;
325 }
326 fprintf(stderr, "Warning: invalid offset %d for GetClassLong()\n", offset);
327 return 0;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000328}
329
330
331/***********************************************************************
332 * SetClassLong (USER.132)
333 */
334LONG SetClassLong( HWND hwnd, short offset, LONG newval )
335{
Alexandre Julliard401710d1993-09-04 10:09:32 +0000336 WND * wndPtr;
Alexandre Julliardf0b23541993-09-29 12:21:49 +0000337 LONG *ptr, retval = 0;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000338
339 if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000340 if (offset >= 0) ptr = (LONG *)(((char *)wndPtr->class->wExtra) + offset);
341 else switch(offset)
342 {
343 case GCL_MENUNAME: ptr = (LONG*)&wndPtr->class->wc.lpszMenuName; break;
344 case GCL_WNDPROC: ptr = (LONG*)&wndPtr->class->wc.lpfnWndProc; break;
345 default:
346 fprintf( stderr, "Warning: invalid offset %d for SetClassLong()\n",
347 offset);
348 return 0;
349 }
Alexandre Julliardf0b23541993-09-29 12:21:49 +0000350 retval = *ptr;
351 *ptr = newval;
Alexandre Julliard401710d1993-09-04 10:09:32 +0000352 return retval;
353}
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000354
355
356/***********************************************************************
357 * GetClassName (USER.58)
358 */
359int GetClassName(HWND hwnd, LPSTR lpClassName, short maxCount)
360{
361 WND *wndPtr;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000362
Alexandre Julliard3ed37e01994-11-07 18:20:42 +0000363 /* FIXME: We have the find the correct hInstance */
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000364 dprintf_class(stddeb,"GetClassName(%04x,%p,%d)\n",hwnd,lpClassName,maxCount);
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000365 if (!(wndPtr = WIN_FindWndPtr(hwnd))) return 0;
Alexandre Julliard594997c1995-04-30 10:05:20 +0000366
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000367 return GlobalGetAtomName( wndPtr->class->atomName, lpClassName, maxCount );
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000368}
369
370
371/***********************************************************************
372 * GetClassInfo (USER.404)
373 */
Alexandre Julliard808cb041995-08-17 17:11:36 +0000374BOOL GetClassInfo( HANDLE hInstance, SEGPTR name, LPWNDCLASS lpWndClass )
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000375{
376 CLASS *classPtr;
Alexandre Julliard3ed37e01994-11-07 18:20:42 +0000377
Alexandre Julliard59730ae1996-03-24 16:20:51 +0000378 dprintf_class( stddeb, "GetClassInfo: hInstance=%04x className=%s\n",
Alexandre Julliard808cb041995-08-17 17:11:36 +0000379 hInstance,
380 HIWORD(name) ? (char *)PTR_SEG_TO_LIN(name) : "(int)" );
381
382 hInstance = GetExePtr( hInstance );
Alexandre Julliardbd34d4f1995-06-20 19:08:12 +0000383
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000384 if (!(classPtr = CLASS_FindClassByName( name, hInstance ))) return FALSE;
Alexandre Julliard5f721f81994-01-04 20:14:34 +0000385 if (hInstance && (hInstance != classPtr->wc.hInstance)) return FALSE;
386
387 memcpy(lpWndClass, &(classPtr->wc), sizeof(WNDCLASS));
388 return TRUE;
389}
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000390
391
392/***********************************************************************
393 * ClassFirst (TOOLHELP.69)
394 */
395BOOL ClassFirst( CLASSENTRY *pClassEntry )
396{
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000397 pClassEntry->wNext = 1;
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000398 return ClassNext( pClassEntry );
399}
400
401
402/***********************************************************************
403 * ClassNext (TOOLHELP.70)
404 */
405BOOL ClassNext( CLASSENTRY *pClassEntry )
406{
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000407 int i;
408 CLASS *class = firstClass;
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000409
Alexandre Julliard2ace16a1996-04-28 15:09:19 +0000410 if (!pClassEntry->wNext) return FALSE;
411 for (i = 1; (i < pClassEntry->wNext) && class; i++) class = class->next;
412 if (!class)
413 {
414 pClassEntry->wNext = 0;
415 return FALSE;
416 }
417 pClassEntry->hInst = class->wc.hInstance;
418 pClassEntry->wNext++;
419 GlobalGetAtomName( class->atomName, pClassEntry->szClassName,
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000420 sizeof(pClassEntry->szClassName) );
421 return TRUE;
422}