CreateWindowEx函数失败,但GetLastError()返回ERROR_SUCCESS

Jos*_*hua 11 c c++ user-interface winapi visual-c++

我正在尝试使用本机Windows消息队列系统(没有.NET)使用C/C++创建一个简单的窗口.我按照MSDN教程编写了一些创建空窗口的基本代码:

void main()
    {
    HINSTANCE hinst;
    HWND hwndMain;
    WNDCLASSEX wnd;
    MSG msg;

    hinst = GetModuleHandle( NULL );
    memset( &wnd, 0, sizeof( wnd ) );
    wnd.cbSize = sizeof( wnd );
    wnd.lpszClassName = "MainWClass";
    wnd.lpfnWndProc = MainWProc;
    wnd.hInstance = hinst;
    int result = RegisterClassEx( &wnd );
    if( !result )
    {
        printf("RegisterClassEx error: %d\r\n", GetLastError() );
    }

    hwndMain = CreateWindowEx
        (
        0, //extended styles
        wnd.lpszClassName, //class name
        "Main Window", //window name
        WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZEBOX, //style tags
        CW_USEDEFAULT, //horizontal position
        CW_USEDEFAULT, //vertical position
        CW_USEDEFAULT, //width
        CW_USEDEFAULT, //height
        (HWND) NULL, //parent window
        (HMENU) NULL, //class menu
        (HINSTANCE) wnd.hInstance, //some HINSTANCE pointer
        NULL //Create Window Data?
        );

    if( !hwndMain )
    {
        printf("Oh shi- %d\n", GetLastError() );
    }
    ShowWindow( hwndMain, SW_SHOWDEFAULT );
    UpdateWindow( hwndMain );
}
Run Code Online (Sandbox Code Playgroud)

当我运行/调试程序时,CreateWindowEx返回0表示失败.这会触发错误消息"哦shi- [错误代码]".最令人困惑的部分是错误消息打印到控制台:

哦shi- 0

GetLastError()返回的错误代码为0,即ERROR_SUCCESS!

我完全失去了; 怎么了?我很困惑......

PS我在Windows 7 32位上使用Visual C++ Express 2010.我已在其他地方编写过Windows程序,但它只是为所有情况返回0.但是,如果有人想看到它,我将很乐意展示它.

我已将Visual C++项目的Project Default字符集更改为"Not Set".我不应该把L加到我的东西上.

编辑:添加了wnd.hInstance = hinst;

编辑:删除不必要的(WNDPROC)强制转换

编辑:为RegisterClassEx添加了错误检查

事实证明问题出在Visual C++ Express上(或者至少不是代码本身).我将代码复制到另一个项目,它工作.

Han*_*ant 37

wnd.lpfnWndProc = (WNDPROC) MainWProc;
Run Code Online (Sandbox Code Playgroud)

我们无法看到您需要使用演员表的真正原因,但它非常可疑.如果没有看到任何错误,Windows会从GetLastError()返回0.如果窗口过程被破坏,可能会发生这种情况.像这个:

LRESULT CALLBACK MainWProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Windows发送WM_NCCREATE消息以请求创建窗口.如果该消息未得到处理,则将没有窗口.没有错误.固定:

LRESULT CALLBACK MainWProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)

根据需要调整以自定义窗口.只需确保为您不想自己处理的每条消息调用DefWindowProc().让Petzold近在咫尺以避免简单的错误.失去了演员.