Winapi Win32 API-注册表类错误
我正试图使用VC++编译器和Visual Studio通过Win32 API打开一个简单的窗口。我想知道为什么这门课不及格;我尝试过在没有指针的情况下分配它,同时将其分配为指针并将其作为引用发送给函数。然而,不管我怎么做,Winapi Win32 API-注册表类错误,winapi,visual-c++,registerclass,Winapi,Visual C++,Registerclass,我正试图使用VC++编译器和Visual Studio通过Win32 API打开一个简单的窗口。我想知道为什么这门课不及格;我尝试过在没有指针的情况下分配它,同时将其分配为指针并将其作为引用发送给函数。然而,不管我怎么做,RegisterClassEx函数都拒绝返回true 为什么会这样?我们能做些什么 来自WinMain WNDCLASSEX* wc = new WNDCLASSEX; HWND hwnd; MSG msg; bool done;
RegisterClassEx
函数都拒绝返回true
为什么会这样?我们能做些什么
来自WinMain
WNDCLASSEX* wc = new WNDCLASSEX;
HWND hwnd;
MSG msg;
bool done;
wc->style = CS_HREDRAW | CS_VREDRAW;
wc->lpfnWndProc = WndProc;
wc->cbClsExtra = 0;
wc->cbWndExtra = 0;
wc->hInstance = hInstance;
wc->hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc->hCursor = LoadCursor(NULL, IDC_ARROW);
wc->hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc->lpszClassName = L"someclass";
if (!RegisterClassEx(wc)) {
MessageBox(NULL, L"Class registration has failed!", L"Error!", MB_OK | MB_ICONINFORMATION);
return 0;
}
您必须通过填写
cbSize
成员来告诉Windows您的WNDCLASSEX
结构有多大。在调用RegisterClassEx
之前,您未能初始化此成员,这可能就是该函数失败的原因。sizeof
操作符就是您所需要的
您还未能初始化结构的一些其他成员,如lpszMenuName
。如果您没有显式初始化它们,则它们包含垃圾数据,这可能导致RegisterClassEx
函数失败。如果不使用它们,则需要显式将它们设置为0
此外,仅仅因为RegisterClassEx
参数接受指向WNDCLASSEX
结构的指针,并不意味着必须将结构创建为指针。您可以在堆栈上创建一个常规对象,并使用操作符的地址(&
)传递指向函数的指针
请注意,根据,您还可以调用,以获取调用RegisterClassEx
函数时出错的更多详细信息。这将帮助您在遇到问题时进行调试
工作示例代码:
WNDCLASSEX wc = {0}; // make sure all the members are zero-ed out to start
wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
wc.lpszClassName = L"someclass";
if (!RegisterClassEx(&wc)) {
MessageBox(NULL, L"Class registration has failed!",
L"Error!", MB_OK | MB_ICONERROR);
return 0;
}
错误代码可能是error\u INVALID\u参数,因为您没有初始化WNDCLASSEX的所有成员。