Win32 API - RegisterClassEx errors

2019-07-23 04:42发布

I'm trying to open a simple window through the Win32 API, using the VC++ compiler and in Visual Studio. I'd like to know why the class fails; I've tried allocating it without a pointer, along with allocating it as a pointer and sending it to the function as a reference. Yet, no matter what I try, the RegisterClassEx function refuses to return true.

Why is this, and what can be done about it?

From WinMain

WNDCLASSEX* wc = new WNDCLASSEX;
    HWND hwnd;
    MSG     msg;
    bool    done;

    wc->style = CS_HREDRAW | CS_VREDRAW;
    wc->lpfnWndProc = WndProc;
    wc->cbClsExtra = 0;
    wc->cbWndExtra = 0;
    wc->hInstance = hInstance;
    wc->hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc->hCursor = LoadCursor(NULL, IDC_ARROW);
    wc->hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wc->lpszClassName = L"someclass";

    if (!RegisterClassEx(wc)) {
        MessageBox(NULL, L"Class registration has failed!", L"Error!", MB_OK | MB_ICONINFORMATION);
        return 0;
    }

1条回答
姐就是有狂的资本
2楼-- · 2019-07-23 05:10

You have to tell Windows how large your WNDCLASSEX structure is by filling in the cbSize member. You failed to initialize this member before calling RegisterClassEx, which is presumably why that function is failing. The sizeof operator is all you need.

You also failed to initialize some of the other members of the structure, like lpszMenuName. If you don't explicitly initialize them, they contain garbage data, which is probably causing the RegisterClassEx function to fail. If you're not using them, you need to explicitly set them to 0.

Furthermore, just because the RegisterClassEx argument accepts a pointer to a WNDCLASSEX structure doesn't mean that you have to create the structure as a pointer. You can create a regular object on the stack and use the address-of operator (&) to pass a pointer to the function.

Note that, as per the documentation, you can also call the GetLastError function to get more details on what went wrong when calling the RegisterClassEx function. This will help you to debug problems when you encounter them.

Working sample code:

WNDCLASSEX wc    = {0};  // make sure all the members are zero-ed out to start
wc.cbSize        = sizeof(wc);
wc.style         = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc   = WndProc;
wc.hInstance     = hInstance;
wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszClassName = L"someclass";

if (!RegisterClassEx(&wc)) {
    MessageBox(NULL, L"Class registration has failed!",
               L"Error!", MB_OK | MB_ICONERROR);
    return 0;
}
查看更多
登录 后发表回答