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 分配一些结构成员(即 hInstancelpfnWndProclpszClassName都将为空)。