在我的项目中,我有2个类:'窗口'和'上下文'。 类'窗口'使用WinAPI实例化一个窗口,一切工作正常。 例如此代码的工作原理如下:类已经存在
Window win("Hello,", 600, 400);
Window win2("World!", 600, 400);
'Context'类创建一个OpenGL 4.0上下文。为了做到这一点, 它需要创建一个临时窗口和临时上下文来检索所有OpenGL 4.0指针,这需要创建一个OpenGL 4.0上下文。 例如此代码也适用:
Window win("Context", 600, 400);
Context ctx(win);
一切工作正常。
但是,我正在重构代码。由于一个窗口根本只有一个上下文,我决定,窗口应该管理上下文,因此它应该实例化并自己删除它。但是这导致我发生奇怪的错误。
// Constructor of window
// We're at the end of the constructor
if(true == bOWnContext)
pContext = internal::Context(*this);
}; // Constructor ends here
当执行应用程序时,我得到一个异常/错误:“类已经注册。” 这就奇怪了,因为下面的代码对我的作品:
Window winA(...);
Window winB(...);
// or
Context ctx(winA);
// This works like a charm
一些collegue的建议,我应该只有一次注册窗口类, 所以我尝试在构造函数如下:
static bool bRegistered = false;
if(false == bRegistered){
WNDCLASSEX wc = {};
wc.cbSize = sizeof(WNDCLASSEX);
wc.hInstance = GetModuleHandle(nullptr);
wc.lpfnWndProc = internal::WndProc;
wc.lpszClassName = pTitle;
wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
if(0 == RegisterClassEx(&wc)){
//
// The exception class will contain the error code and
// a error discription.
//
std::error_code err_code(GetLastError(), std::system_category());
throw std::system_error(err_code);
}
bRegistered = true;
}
然而,这给了我另一个错误“找不到窗口类”。
有人可以启发我,为什么我的代码不工作?
你的窗口类没有类名。它不能被引用。不知道你在调用CreateWindow [Ex]'时提供的窗口类名称。 GetModuleHandle(nullptr)'是一个等待发生的错误,只要将代码编译成DLL即可。无论如何,您提供的代码不是类注册失败的地方,并带有*“已注册”*错误消息。 – IInspectable
窗口类名称等于我在构造函数中提供的窗口的名称。现在我明白为什么出现'找不到窗口类'的错误。 GetModuleHandle(nullptr)有什么问题?我已经编译成一个DLL,它的工作原理。唯一的失败是,如果我在另一个窗口内创建一个新窗口。 – Julien
哦,你说得对,你提供的是一个班级名称。 'GetModuleHandle(nullptr)'有什么问题:它将模块句柄返回给EXE,而不是DLL。但它是实现窗口过程的DLL。包罗万象的解决方案,找到正确的模块句柄:从静态库访问当前模块的HINSTANCE(https://blogs.msdn.microsoft.com/oldnewthing/20041025-00/?p=37483)。 – IInspectable