为什么包含在类方法中的Win32调用失败?

使用Direct3D教程 ,我学习了知识并将其封装到一个类中。 该代码建立在MSVC 2010罚款,我已经处理了与我的项目有最高的警告级别的所有编译器警告。 当从入口点逐步执行代码时,程序无法通过RegisterClassEx(&wc)。 之后,该程序很好地告诉退出。 在运行unique_ptr的析构函数之后(不是手动的,但在unique_ptr超出作用域之后),程序崩溃了无效的内存访问。

我的WinMain看起来像这样:

std::unique_ptr<Engine> j_engine(new Engine); j_engine->CreateD3DWindow(title, width, height, fullscreen); //public method of Engine, similar to CreateD3DWindow from the tutorial while(message looping) { // etc } //if loop is exited, let j_engine fall out of scope (my program has never reached this point) 

我的CreateD3DWindow方法的开始包含非常标准的窗口创建代码,甚至在崩溃之前甚至不包含Direct3D调用的碎片(RegisterClassEx())。

基本上是:

 WNDCLASSEX wc; hInstance = GetModuleHandle(NULL); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "SomeName"; RegisterClassEx(&wc); // fails. GetLastError() == "Invalid Parameters". Stepping through WNDCLASSEX struct creation doesn't raise any invalid parameter flags. 

在声明WNDCLASSEX wc之后,我也尝试过使用ZeroMemory()。

当我input这个内容时,有两件事情在我心中注册:
1. GetModuleHandle()被从类内部调用,该类存在于堆中,并被来自WinMain的指针引用。 这很重要吗? 它提供了一个有效的句柄?
2. WndProc声明和定义是在类的外面和类的名字空间之外的。 这是否意味着WNDCLASSEX.lpfnWndProc无法看到它? 因此:

 #includes LRESULT CALLBACK WndProc() { } namespace xyz { class Engine { } } 

我没有想法,解决问题的能力正在下降。 有什么建议? 如有必要,我一定会提供更多信息。

具体来说,我想知道为什么RegisterClassEx()失败。

谢谢!

***下面提到,GetModuleHandle(NULL)将为给定的进程返回一个全局句柄,所以在这个程序中调用的上下文应该没有关系。

从它的外观你忘了填写WNDCLASSEX结构的cbSize成员。 因此,API不能确定你得到的结构的版本,因此返回无效的参数值。

我相信你想用WNDCLASSEX来使用RegisterClassEx

另外, GetModuleHandle(NULL)返回一个进程全局句柄,只要你的可执行文件被加载,这个句柄将是有效的。