2015-04-27 7 views
0

Я новичок в C++ и WinApi. Я не могу создать простое окно в WinApi. Функция CreateWindow() возвращает значение null. GetLastError() func возвращает ошибку 1813. Но перед созданием окна GetLastError() возвращает 0. Извините за мой английский. Вот мой полный код:Ошибка 1813 при вызове CreateWindow() func WinApi

#include <Windows.h> 

LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam); 

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) 
{ 
LPCWSTR szWindowClass = TEXT("WndClass"); 
LPCWSTR szTitle = TEXT("Main window"); 
DWORD dwError; 

WNDCLASS wc; 
wc.style = CS_OWNDC; 
wc.hInstance = hInstance; 
wc.cbClsExtra = 0; 
wc.cbWndExtra = 0; 
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 
wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); 

wc.lpfnWndProc = WndProc; 
wc.lpszClassName = szWindowClass; 
wc.lpszMenuName = L"MenuName"; 
dwError = GetLastError(); //0 

RegisterClass(&wc); 
dwError = GetLastError();//0 


HWND hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 
    CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);//NULL 

dwError = GetLastError();//1813 =(
return 0; 
} 

LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam) 
{ 
return 0; 
} 

ответ

1

Прежде всего, ваша обработка ошибок неверна. В документации указано, что вы вызываете GetLastError, только если CreateWindow не удалось. И ошибка CreateWindow указывается возвращаемым значением NULL. Перед вызовом GetLastError необходимо проверить возвращаемое значение CreateWindow. Пожалуйста, внимательно прочитайте documentation.

Вы делаете такую ​​же ошибку в своем запросе: RegisterClass. В вашей защите это самая распространенная ошибка, допущенная начинающими программистами Win32.

Код ошибки 1813, is ERROR_RESOURCE_TYPE_NOT_FOUND. documentation говорит:

Указанный тип ресурса не может быть найден в файле изображения.

Снова, вы можете узнать эту информацию, прочитав документацию, как только вы знаете, где искать.

Это означает, что CreateWindow пытается найти ресурс, которого нет в файле. Возможно, вам не удалось связать ресурс меню.

Ваше оконное устройство также повреждено. Оно должно быть:

LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    return DefWindowProc(hWnd, Msg, wParam, lParam); 
} 

Когда вы начинаете добавлять заказ обработки определенных сообщений, убедитесь, что вы до сих пор называют DefWindowProc для любых других сообщений.

2

Вам необходимо вернуть результат DefWindowProc для сообщений, с которыми вы не справитесь.
Для получения дополнительной информации см. here.