Win32 Window 包装器错误(参数不正确)
Error with Win32 Window Wrapper (Incorrect Parameter)
我正在为 win32 编写一个 window 包装器,以便更轻松地创建 gui。我有一个抽象显示 class、一个显示class class 和一个显示class。最后, window 没有出现。经过一些调试后,我的 windowclass 没有正确注册。在 GetLastError 之后,我得到了 INVALID PARAMETER
的错误代码
displayclass.h:
#pragma once
#include <Windows.h>
#include "abstractdisplay.h"
class DisplayClass : protected WNDCLASSEX
{
public:
// Public variables
private:
// Private variables
protected:
// Protected variables
public:
// Public functions
DisplayClass(HINSTANCE hInst, const TCHAR* className);
DisplayClass();
~DisplayClass();
// Registers the class
// Get the class name
virtual const TCHAR* getClassName() const { return lpszClassName; }
virtual bool Register();
private:
// Private functions
protected:
// Protected functions
};
displayclass.cpp:
#include "displayclass.h"
#include "abstractdisplay.h"
#include <string>
#include <cstring>
DisplayClass::DisplayClass(HINSTANCE hInst, const TCHAR* className)
{
hInstance = hInst;
// All messages for windows that belong to this Window Class will be sent to Message Router
lpfnWndProc = AbstractDisplay::MessageRouter;
lpszClassName = className;
// Set values for the rest of the WNDCLASSEX structure
ZeroMemory(this, sizeof(WNDCLASSEX));
lpszMenuName = 0;
cbSize = sizeof(WNDCLASSEX);
cbClsExtra = 0;
cbWndExtra = 0;
hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
hIconSm = ::LoadIcon(NULL, IDI_APPLICATION);
hCursor = ::LoadCursor(NULL, IDC_ARROW);
style = CS_HREDRAW | CS_VREDRAW;
hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
}
DisplayClass::DisplayClass()
{
}
DisplayClass::~DisplayClass()
{
}
// Returns the last Win32 error, in string format. Returns an empty string if there is no error.
std::string GetLastErrorAsString()
{
// Get the error message, if any.
DWORD errorMessageID = ::GetLastError();
if (errorMessageID == 0)
return std::string(); // No error message has been recorded
LPSTR messageBuffer = nullptr;
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
std::string message(messageBuffer, size);
// Free the buffer.
LocalFree(messageBuffer);
return message;
}
bool DisplayClass::Register()
{
if (::RegisterClassEx(this) != 0)
{
return true;
}
else
{
OutputDebugString("ERROR CODE BE LIKE:");
OutputDebugString(GetLastErrorAsString().c_str());
OutputDebugString("\n");
return false;
}
}
调试:
ERROR CODE BE LIKE:The parameter is incorrect.
(有点遵循此来源:http://www.infernodevelopment.com/c-win32-api-simple-gui-wrapper)
您正在调用 ZeroMemory
分配一些结构成员(即 hInstance
、lpfnWndProc
和 lpszClassName
都将为空)。
我正在为 win32 编写一个 window 包装器,以便更轻松地创建 gui。我有一个抽象显示 class、一个显示class class 和一个显示class。最后, window 没有出现。经过一些调试后,我的 windowclass 没有正确注册。在 GetLastError 之后,我得到了 INVALID PARAMETER
的错误代码displayclass.h:
#pragma once
#include <Windows.h>
#include "abstractdisplay.h"
class DisplayClass : protected WNDCLASSEX
{
public:
// Public variables
private:
// Private variables
protected:
// Protected variables
public:
// Public functions
DisplayClass(HINSTANCE hInst, const TCHAR* className);
DisplayClass();
~DisplayClass();
// Registers the class
// Get the class name
virtual const TCHAR* getClassName() const { return lpszClassName; }
virtual bool Register();
private:
// Private functions
protected:
// Protected functions
};
displayclass.cpp:
#include "displayclass.h"
#include "abstractdisplay.h"
#include <string>
#include <cstring>
DisplayClass::DisplayClass(HINSTANCE hInst, const TCHAR* className)
{
hInstance = hInst;
// All messages for windows that belong to this Window Class will be sent to Message Router
lpfnWndProc = AbstractDisplay::MessageRouter;
lpszClassName = className;
// Set values for the rest of the WNDCLASSEX structure
ZeroMemory(this, sizeof(WNDCLASSEX));
lpszMenuName = 0;
cbSize = sizeof(WNDCLASSEX);
cbClsExtra = 0;
cbWndExtra = 0;
hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
hIconSm = ::LoadIcon(NULL, IDI_APPLICATION);
hCursor = ::LoadCursor(NULL, IDC_ARROW);
style = CS_HREDRAW | CS_VREDRAW;
hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
}
DisplayClass::DisplayClass()
{
}
DisplayClass::~DisplayClass()
{
}
// Returns the last Win32 error, in string format. Returns an empty string if there is no error.
std::string GetLastErrorAsString()
{
// Get the error message, if any.
DWORD errorMessageID = ::GetLastError();
if (errorMessageID == 0)
return std::string(); // No error message has been recorded
LPSTR messageBuffer = nullptr;
size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorMessageID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&messageBuffer, 0, NULL);
std::string message(messageBuffer, size);
// Free the buffer.
LocalFree(messageBuffer);
return message;
}
bool DisplayClass::Register()
{
if (::RegisterClassEx(this) != 0)
{
return true;
}
else
{
OutputDebugString("ERROR CODE BE LIKE:");
OutputDebugString(GetLastErrorAsString().c_str());
OutputDebugString("\n");
return false;
}
}
调试:
ERROR CODE BE LIKE:The parameter is incorrect.
(有点遵循此来源:http://www.infernodevelopment.com/c-win32-api-simple-gui-wrapper)
您正在调用 ZeroMemory
分配一些结构成员(即 hInstance
、lpfnWndProc
和 lpszClassName
都将为空)。