Winapi C++;CreateWindowEx()无法创建窗口

Winapi C++;CreateWindowEx()无法创建窗口,winapi,Winapi,我开始观看手工制作的hero视频,并试图制作一个win32窗口,但CreateWindowEx()函数一直失败 我检查了错误代码,得到了1407 代码如下 提前谢谢 #include <Windows.h> LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { LRESULT result; s

我开始观看手工制作的hero视频,并试图制作一个win32窗口,但CreateWindowEx()函数一直失败

我检查了错误代码,得到了1407

代码如下

提前谢谢

    #include <Windows.h>

LRESULT CALLBACK WindowProcedure(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
    )
{
    LRESULT result;

    switch (uMsg)
    {
    case WM_ACTIVATEAPP:
        {
            OutputDebugStringA("The window is now active");

            break;
        }

    case WM_SIZE:
        {
            OutputDebugStringA("The window is now being resized");

            break;
        }

    case WM_CREATE:
        {
            OutputDebugStringA("The window has been created");

            break;
        }

    default:
        {
            result = DefWindowProc(hwnd, uMsg, wParam, lParam);

            break;
        }
    }

    return result;
};

int CALLBACK WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
    )
{
    WNDCLASS GameWindow;

    GameWindow.style = CS_OWNDC|CS_HREDRAW|CS_VREDRAW;
    GameWindow.lpfnWndProc = WindowProcedure;
    GameWindow.hInstance = hInstance;
//      HICON     hIcon;
    GameWindow.lpszClassName = "HandmadeHeroWindowClass";

    RegisterClass(&GameWindow);

    if (HWND GameWindowHandle = CreateWindowEx(
        0,
        GameWindow.lpszClassName,
        "Handmade Hero",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        0,
        0,
        hInstance,
        0
        ))
    {

        for (;;)
        {
            MSG message;
            BOOL messageResult = GetMessage(&message, GameWindowHandle, 0, 0);
            if (messageResult != 0)
            {
                DispatchMessage(&message);
            }
            else if (messageResult == 0)
            {
                break;
            }
            else
            {
                // ERROR
            }
        }

    }
    else
    {
        OutputDebugStringA("Couldn't create window");
    }

    DWORD error = GetLastError();

    return 0;
};
#包括
LRESULT回调窗口过程(
HWND HWND,
联合通讯社,
WPARAM WPARAM,
LPARAM
)
{
结果;
开关(uMsg)
{
案例WM_激活EAPP:
{
OutputDebugStringA(“窗口现在处于活动状态”);
打破
}
案例WM_大小:
{
OutputDebugStringA(“窗口现在正在调整大小”);
打破
}
案例WM_创建:
{
OutputDebugStringA(“已创建窗口”);
打破
}
违约:
{
结果=DefWindowProc(hwnd、uMsg、wParam、lParam);
打破
}
}
返回结果;
};
int回调WinMain(
HINSTANCE HINSTANCE,
HINSTANCE HPPrevenstance,
LPSTR lpCmdLine,
国际nCmdShow
)
{
WNDCLASS游戏窗口;
GameWindow.style=CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
GameWindow.lpfnWndProc=WindowProcedure;
GameWindow.hInstance=hInstance;
//HICON HICON;
GameWindow.lpszClassName=“手工制作的窗口类”;
注册表类(和游戏窗口);
如果(HWND GameWindowHandle=CreateWindowEx(
0,
GameWindow.lpszClassName,
“手工制作的英雄”,
WS|U重叠窗口| WS|U可见,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
CW_使用默认值,
0,
0,
hInstance,
0
))
{
对于(;;)
{
消息;
BOOL messageResult=GetMessage(&message,GameWindowHandle,0,0);
if(messageResult!=0)
{
DispatchMessage(&message);
}
else if(messageResult==0)
{
打破
}
其他的
{
//错误
}
}
}
其他的
{
OutputDebugStringA(“无法创建窗口”);
}
DWORD error=GetLastError();
返回0;
};

您的窗口过程在每个路径中返回一个未初始化的变量,默认值除外:,这是未定义的行为,窗口创建失败是完全可能的

对于
WM_CREATE
,文档说明:

如果应用程序处理此消息,则应返回零以继续创建窗口



正如Michael在评论中指出的,
RegisterClass
正在失败。同一类错误,您传递的是一个
WNDCLASS
结构,导致大多数成员未初始化。

多亏了Remy Lebeau的回答,问题是我的WNDCLASS对所有字段都没有初始化值,除了我更改的字段,这导致RegisterClass()失败,从而导致CreateWindowEx()失败

我将WNDCLASS声明更改为:

WNDCLASS GameWindow = {0};

感谢所有帮助您的人。

1407==
ERROR\u找不到\u WND\u类
查看您的注册类是否成功。我猜不是。我同意IMJ
RegisterClass()
可能会失败,因为许多
WNDCLASS
字段未初始化。始终为零初始化API结构,并始终检查API函数调用中的错误代码。@RemyLebeau非常感谢您remy,我将所有字段初始化为零,然后更改了我想要的字段,现在它可以工作了。谢谢大家。@Remy:文档并没有说明所有非零值的情况。只有0和-1。无论哪种方式,返回未初始化的值都是UB。我删除了我的开关,让它返回DefWindowProc(hwnd、uMsg、wParam、lParam),但仍然不起作用。