Winapi Win32 API-注册表类错误

Winapi Win32 API-注册表类错误,winapi,visual-c++,registerclass,Winapi,Visual C++,Registerclass,我正试图使用VC++编译器和Visual Studio通过Win32 API打开一个简单的窗口。我想知道为什么这门课不及格;我尝试过在没有指针的情况下分配它,同时将其分配为指针并将其作为引用发送给函数。然而,不管我怎么做,RegisterClassEx函数都拒绝返回true 为什么会这样?我们能做些什么 来自WinMain WNDCLASSEX* wc = new WNDCLASSEX; HWND hwnd; MSG msg; bool done;

我正试图使用VC++编译器和Visual Studio通过Win32 API打开一个简单的窗口。我想知道为什么这门课不及格;我尝试过在没有指针的情况下分配它,同时将其分配为指针并将其作为引用发送给函数。然而,不管我怎么做,
RegisterClassEx
函数都拒绝返回true

为什么会这样?我们能做些什么

来自
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;
    }

您必须通过填写
cbSize
成员来告诉Windows您的
WNDCLASSEX
结构有多大。在调用
RegisterClassEx
之前,您未能初始化此成员,这可能就是该函数失败的原因。
sizeof
操作符就是您所需要的

您还未能初始化结构的一些其他成员,如
lpszMenuName
。如果您没有显式初始化它们,则它们包含垃圾数据,这可能导致
RegisterClassEx
函数失败。如果不使用它们,则需要显式将它们设置为0

此外,仅仅因为
RegisterClassEx
参数接受指向
WNDCLASSEX
结构的指针,并不意味着必须将结构创建为指针。您可以在堆栈上创建一个常规对象,并使用操作符的地址(
&
)传递指向函数的指针

请注意,根据,您还可以调用,以获取调用
RegisterClassEx
函数时出错的更多详细信息。这将帮助您在遇到问题时进行调试

工作示例代码:

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;
}

错误代码可能是error\u INVALID\u参数,因为您没有初始化WNDCLASSEX的所有成员。