Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;。I';我在CreateWindow上遇到访问冲突,使用getter检索类名字符串_C++_Callback_Hwnd_Createwindow - Fatal编程技术网

C++ C++;。I';我在CreateWindow上遇到访问冲突,使用getter检索类名字符串

C++ C++;。I';我在CreateWindow上遇到访问冲突,使用getter检索类名字符串,c++,callback,hwnd,createwindow,C++,Callback,Hwnd,Createwindow,(复制并粘贴在底部的错误“代码”) 我在网上学习教程,但也有3本书,通过微软@ EDX完成了一个高级C++课程,但是我意识到我还是初学者。我提到这一点是为了让人们不认为我主要是通过糟糕的youtube教程来学习,我不是 这个错误来自于我创建的C++窗口类“窗口”,它保存了另一个类“Window类”。它们用于创建窗口,内部singleton类隐藏了详细信息 我将从构造函数中复制我认为相关的代码 似乎问题可能出在窗口构造函数@hWnd=CreateWindow中(此处,名称等: Window::Wi

(复制并粘贴在底部的错误“代码”)

<>我在网上学习教程,但也有3本书,通过微软@ EDX完成了一个高级C++课程,但是我意识到我还是初学者。我提到这一点是为了让人们不认为我主要是通过糟糕的youtube教程来学习,我不是

这个错误来自于我创建的C++窗口类“窗口”,它保存了另一个类“Window类”。它们用于创建窗口,内部singleton类隐藏了详细信息

我将从构造函数中复制我认为相关的代码

似乎问题可能出在窗口构造函数@hWnd=CreateWindow中(此处,名称等:

Window::Window(int width, int height, const char* name) noexcept

{
    RECT wr;
    wr.left = 100;
    wr.right = width + wr.left;
    wr.top = 100;
    wr.bottom = height + wr.top;
    AdjustWindowRect(&wr, WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU, false);
    //create window & get hWnd
    hWnd = CreateWindow(WindowClass::GetName(), name, WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | CW_USEDEFAULT | CW_USEDEFAULT, wr.right, wr.left, wr.bottom, wr.top, nullptr, nullptr, WindowClass::GetInstance(), this);

    ShowWindow(hWnd, SW_SHOWDEFAULT);
}
如果我将CreateWindow的第一个参数更改为我认为称为字符串文字的参数,即“Window”而不是GetName()getter,那么程序似乎运行正常

下面是getter的代码,请注意getter在其他地方似乎工作得很好

wc.lpszClassName = GetName();
吸气剂:

const char* Window::WindowClass::GetName() noexcept {

    return wndClassName;
}
虽然我不想复制太多代码,但下面是WindowClass,它位于其父类“Window”中

还请注意,我的心理健康状况不太好,编码对我的心理健康恢复确实有帮助(其间有很多休息),争吵和侮辱则没有。但我很乐意接受建设性的反馈

class WindowClass
{
public:
    static const char* GetName() noexcept;
    static HINSTANCE GetInstance() noexcept;

private:
    WindowClass() noexcept;
    ~WindowClass();
    WindowClass(const WindowClass&) = delete;
    WindowClass& operator=(const WindowClass&) = delete;
    static constexpr const char* wndClassName = "Ryan Direct3d";
    static WindowClass wndClass;
    HINSTANCE hInst;
};
我感谢所有与此相关的反馈。为什么我会得到: WindowsApp1.exe中0x00000000处引发异常:0xC0000005:访问冲突执行位置0x00000000。 WindowsApp1.exe中0x7155CCE0处的未处理异常:0xC000041D:在用户回调期间遇到未处理的异常

要在此行下面编译的代码


#包括
#包括
类窗口
{
私人:
//singleton类-管理窗口类(未注册)的注册和清理
类窗口类
{
公众:
静态常量char*GetName()noexcept;
静态HINSTANCE GetInstance()noexcept;
私人:
WindowClass()不例外;
~WindowClass();
WindowClass(常量WindowClass&)=删除;
WindowClass&operator=(常量WindowClass&)=删除;
//getter调用的wndClassName
静态constexpr const char*wndClassName=“Ryan”;
静态窗口类wndClass;
HINSTANCE hInst;
};
公众:
窗口(整数宽度、整数高度、常量字符*名称)无例外;
~Window();
窗口(常数窗口&)=删除;
窗口和运算符=(常量窗口和)=删除;
私人:
整数宽度=0;
整数高度=0;
HWND-HWND;
};
//窗口类的东西
Window::WindowClass Window::WindowClass::wndClass//
Window::WindowClass::WindowClass()noexcept:hInst(GetModuleHandle(nullptr))
{
WNDCLASSEX wc={0};
wc.cbSize=sizeof(wc);
wc.style=CS_OWNDC;
//wc.lpfnWndProc=WndProc;
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=GetInstance();
wc.hIcon=nullptr;
wc.hCursor=nullptr;
wc.hbrBackground=nullptr;
wc.lpszMenuName=nullptr;
wc.lpszClassName=GetName();
wc.hIconSm=nullptr;
注册类别(&wc);
}
常量字符*Window::WindowClass::GetName()noexcept{
返回wndClassName;
}
HINSTANCE Window::WindowClass::GetInstance()noexcept{
返回wndClass.hInst;
}
Window::WindowClass::~WindowClass()
{
注销类(wndClassName,GetInstance());
}
//窗口创建
窗口::窗口(整型宽度、整型高度、常量字符*名称)无例外
{
矩形波;
wr.left=100;
wr.右=宽度+wr.左;
wr.top=100;
wr.底部=高度+wr.顶部;
AdjustWindowRect(&wr,WS_标题| WS_最小化框| WS_系统菜单,错误);
//创建窗口并获取hWnd
hWnd=CreateWindow(“Ryan”,名称,WS_标题| WS_最小化框| WS_系统菜单| CW_使用默认值| CW_使用默认值,wr.right,wr.left,wr.bottom,wr.top,nullptr,nullptr,WindowClass::GetInstance(),nullptr);
展示窗口(hWnd、SW_展示);
}
窗口::~Window(){
窗口(hWnd);
}
//wndprocs
LRESULT回调WndProc(HWND HWND,UINT msg,WPARAM WPARAM,LPARAM LPARAM)
{
switch(msg)//使用开关,因为将来我们将添加/处理多种消息
{
案例WM_KEYUP:
如果(wParam=='F')
{
SetWindowText(hWnd,Dogmah);
}
打破
案例WM_结束:
发帖信息(69);
打破
案例WM_键控:
如果(wParam=='F')
{
SetWindowText(hWnd,“新名称”);
}
打破
案例WM_CHAR:
{
静态std::字符串标题;
标题。推回((字符)wParam);
SetWindowText(hWnd,title.c_str());
}
案例WM_LBUTTONDOWN:
{
}
}
返回DefWindowProc(hWnd、msg、wParam、lParam);
}
int回调WinMain(
HINSTANCE HINSTANCE,
HINSTANCE HPPrevenstance,
LPSTR lpCmdLine,
国际展览(nCmdShow)
{
窗口Ryan(600500,“嘿”);
//信息泵
味精;
布尔·格雷苏特;
//注册自定义类以输出额外的消息详细信息
while((gResult=GetMessage(&msg,nullptr,0,0))>0)
{
翻译信息(&msg);
发送消息(&msg);
}
如果(gResult==-1){return-1;}
else{return msg.wParam;}
返回0;
}

您在WNDCLASSEX中注释掉了WndProc分配:

Window::WindowClass::WindowClass() noexcept : hInst(GetModuleHandle(nullptr))
{

    WNDCLASSEX wc = { 0 };
    wc.cbSize = sizeof(wc);
    wc.style = CS_OWNDC;
    //wc.lpfnWndProc = WndProc;
    ...
要修复此问题,只需向前声明WndProc函数(定义如下)并取消注释

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

//Window Class stuff
Window::WindowClass Window::WindowClass::wndClass; //
Window::WindowClass::WindowClass() noexcept : hInst(GetModuleHandle(nullptr))
{

    WNDCLASSEX wc = { 0 };
    wc.cbSize = sizeof(wc);
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    ...
在我做出更改后,崩溃消失,您的窗口显示:


你能发布一个。我们可以直接将它复制到visual studio项目中,编译并运行吗?是的,但它有4个文件。虽然它们很小。我应该在这里复制文本吗?不是发布4个文件,而是发布一个复制问题的文件。这可能会迫使你重构代码,但也可能会让你在自己的网站上找到错误n、 我来试一试,有地方吗
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

//Window Class stuff
Window::WindowClass Window::WindowClass::wndClass; //
Window::WindowClass::WindowClass() noexcept : hInst(GetModuleHandle(nullptr))
{

    WNDCLASSEX wc = { 0 };
    wc.cbSize = sizeof(wc);
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    ...