Функция CreateWindowEx не работает, но GetLastError () возвращает ERROR_SUCCESS

Я пытаюсь создать простое окно на C / C ++, используя собственную систему очереди сообщений Windows (без .NET). Я следовал руководству 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 );
}

Когда я запускаю / отлаживаю программу, CreateWindowEx возвращает 0, что означает сбой. Это вызывает сообщение об ошибке «Ой ши [код ошибки]». Самая запутанная часть заключается в том, что на консоль выводится сообщение об ошибке:

Oh shi- 0

Код ошибки, возвращаемый GetLastError (), равен 0, то есть ERROR_SUCCESS!

Я в полной растерянности; что происходит? Я так запуталась ...

P.S. Я использую Visual C ++ Express 2010 в 32-разрядной версии Windows 7. Я написал процедуру Windows в другом месте, но она просто возвращает 0 для всех случаев. Но если кто-то захочет это увидеть, я с радостью покажу.

Я изменил набор символов по умолчанию для моего проекта Visual C ++ на «Не задан». Мне не нужно добавлять префикс L к моим вещам.

Правка: добавлен wnd.hInstance = hinst;

Правка: удалено ненужное приведение (WNDPROC)

Правка: добавлена ​​проверка ошибок для RegisterClassEx

Оказывается, проблема была в Visual C ++ Express (или по крайней мере, не с самим кодом). Я скопировал код в другой проект, и он сработал.

11
задан Adrian McCarthy 13 November 2015 в 21:07
поделиться