调用 CreateWindow() func WinApi 时出现错误 1813
Error 1813 when calling CreateWindow() func WinApi
我是 C++ 和 WinApi 的新手。我无法在 WinApi 中创建简单的 window。 CreateWindow() 函数 returns 空。 GetLastError() 函数 returns 错误 1813。
但是在创建 window GetLastError() returns 0 之前。对不起我的英语。这是我的完整代码:
#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;
}
首先,你的错误处理是错误的。文档告诉您仅当 CreateWindow
失败时才调用 GetLastError
。 CreateWindow
失败由 NULL
的 return 值表示。在调用 GetLastError
之前,您必须检查 CreateWindow
的 return 值。请务必仔细阅读documentation。
您在调用 RegisterClass
时犯了完全相同的错误。为您辩护,这是新手 Win32 程序员最常犯的错误。
错误代码 1813,是 ERROR_RESOURCE_TYPE_NOT_FOUND
。 documentation 表示:
The specified resource type cannot be found in the image file.
同样,您可以通过阅读文档了解此信息,一旦您知道在哪里查看。
这意味着 CreateWindow
正在尝试查找文件中不存在的资源。也许您没有设法 link 菜单资源。
您的 window 程序也有缺陷。应该是:
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
当您开始为某些消息添加定制处理时,请确保您仍然为任何其他消息调用 DefWindowProc
。
对于您不自己处理的邮件,您需要 return DefWindowProc
的结果。
有关详细信息,请参阅 here。
我是 C++ 和 WinApi 的新手。我无法在 WinApi 中创建简单的 window。 CreateWindow() 函数 returns 空。 GetLastError() 函数 returns 错误 1813。 但是在创建 window GetLastError() returns 0 之前。对不起我的英语。这是我的完整代码:
#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;
}
首先,你的错误处理是错误的。文档告诉您仅当 CreateWindow
失败时才调用 GetLastError
。 CreateWindow
失败由 NULL
的 return 值表示。在调用 GetLastError
之前,您必须检查 CreateWindow
的 return 值。请务必仔细阅读documentation。
您在调用 RegisterClass
时犯了完全相同的错误。为您辩护,这是新手 Win32 程序员最常犯的错误。
错误代码 1813,是 ERROR_RESOURCE_TYPE_NOT_FOUND
。 documentation 表示:
The specified resource type cannot be found in the image file.
同样,您可以通过阅读文档了解此信息,一旦您知道在哪里查看。
这意味着 CreateWindow
正在尝试查找文件中不存在的资源。也许您没有设法 link 菜单资源。
您的 window 程序也有缺陷。应该是:
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
当您开始为某些消息添加定制处理时,请确保您仍然为任何其他消息调用 DefWindowProc
。
对于您不自己处理的邮件,您需要 return DefWindowProc
的结果。
有关详细信息,请参阅 here。