Я пытаюсь создать простое окно с 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- [код ошибки]". Наиболее запутанной частью является то, что сообщение об ошибке выводится на консоль:
Oh shi- 0
Код ошибки, возвращаемый GetLastError(), равен 0, что является ERROR_SUCCESS!
У меня полная потеря; что происходит? Я так запутался...
P.S. Я использую Visual С++ Express 2010 на 32-разрядной версии Windows 7. Я написал процедуру Windows в другом месте, но она просто возвращает 0 для всех случаев. Если, однако, кто-то захочет это увидеть, я с удовольствием покажу его.
Я изменил набор символов проекта по умолчанию моего проекта Visual С++ на "Не задано". Мне не нужно приписывать L моим вещам.
Изменить: добавлено wnd.hInstance = hinst;
Изменить: удалить ненужный (WNDPROC) листинг
Изменить: добавлена проверка ошибок для RegisterClassEx
Оказывается, проблема была в Visual С++ Express (или, по крайней мере, не с самим кодом). Я скопировал код в другой проект, и он сработал.