Я пытаюсь создать простое окно на 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 (или по крайней мере, не с самим кодом). Я скопировал код в другой проект, и он сработал.