INF: Reasons Why RegisterClass() and CreateWindow() Fail

ID Number: Q65257

2.03 2.10 3.00

WINDOWS

Summary:

The RegisterClass() and CreateWindow() functions fail when the system

resources are used up. The percentage of free system resources

reflects the amount of available space in the USER and GDI heaps

within Windows. The smaller amount of free space is reported in the

Program Manager's About box because if either heap fills up, functions

fail.

If the amount of free system resources remains low after the

application is exited, it is more likely that the GDI heap is filling.

The main reason for the GDI heap filling is that GDI objects that are

created by the application are not deleted or destroyed when they are

no longer needed, or when the program terminates. Windows does not

delete GDI objects (pens, brushes, fonts, regions, and bitmaps) when

the program exits. Objects must be properly deleted or destroyed.

The following are two situations that can cause the USER heap to get

full:

1. Memory is allocated for "extra bytes" associated with window

classes and windows themselves. Make sure that the cbClsExtra and

cbWndExtra fields in the WNDCLASS structure are set to 0 (zero),

unless they really are being used.

2. Menus are stored in the USER heap. If menus are added but are not

destroyed when they are no longer needed, or when the application

terminates, system resources will go down.

CreateWindow() will also fail under the following conditions:

1. Windows cannot find the window procedure listed in the

CreateWindow() call. Avoid this by ensuring that each window

procedure is listed in the EXPORTS section of the program's DEF

file.

2. CreateWindow() cannot find the specified window class.

3. The hwndparent is incorrect (make sure to use debug Windows to see

the RIPs).

4. CreateWindow() cannot allocate memory for internal structures in

USER heap.

5. The application returns 0 (zero) to the WM_NCCREATE message.

6. The application returns -1 to the WM_CREATE message.