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