Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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++ OpenGL上下文创建失败_C++_Opengl - Fatal编程技术网

C++ OpenGL上下文创建失败

C++ OpenGL上下文创建失败,c++,opengl,C++,Opengl,我试图通过Win32 API创建一个OpenGL上下文,而不使用GLUT这样的包装器。我以前做过很多次,但这次我犯了两个错误中的一个;有时,当您退出窗口时,应用程序不会结束,但几秒钟后,应用程序在调试窗口中以以下消息结束: Palette watcher thread id 5100 possible deadlock with DLL unload, killing the palette watcher Unable to open the palette watcher thread id

我试图通过Win32 API创建一个OpenGL上下文,而不使用GLUT这样的包装器。我以前做过很多次,但这次我犯了两个错误中的一个;有时,当您退出窗口时,应用程序不会结束,但几秒钟后,应用程序在调试窗口中以以下消息结束:

Palette watcher thread id 5100 possible deadlock with DLL unload, killing the palette watcher
Unable to open the palette watcher thread id 5100 for termination!
当窗口关闭时,有时会显示第二条消息:

PostMessage to hwnd: 00120266 failed with error: 00000578
我已经在谷歌上搜索过了,其中一个人发现了一个类似的问题,这个问题似乎源于SetupPixelFormat。我不知道是什么原因造成的。除了OpenGL渲染上下文设置之外,我已经排除了所有其他代码的问题

以下是我的设置:

BOOL Win32Handler::CreateOpenGLContext(void)
{

int pixelFormat;
this->hdc = GetDC(this->windowHandle);

PIXELFORMATDESCRIPTOR PFD =
{
    sizeof(PIXELFORMATDESCRIPTOR),
    1,
    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    PFD_TYPE_RGBA,
    32,
    0,0,0,0,0,0,
    0,
    0,
    0,
    0,0,0,0,
    24,
    8,
    0,
    PFD_MAIN_PLANE,
    0,
    0,0,0
};

pixelFormat = ChoosePixelFormat(this->hdc,&PFD);
if(!SetPixelFormat(this->hdc,pixelFormat,&PFD)) return FALSE;

this->hglrc = wglCreateContext(this->hdc);
if(!this->hglrc) return FALSE;

if(!wglMakeCurrent(this->hdc,this->hglrc)) return FALSE;

glewExperimental = TRUE;
GLenum error = glewInit();

if(error != GLEW_OK) return FALSE;

return TRUE;
}

创建窗口后,在我的main方法中调用此函数

我知道OpenGL上下文也没有创建,因为SwapBuffers()glClearColor()似乎不起作用

请注意,当我不调用设置代码时,这些错误不会发生。
另外,这两种情况似乎是随机发生的,有时当我关闭应用程序时,一种情况发生了,而另一种情况没有发生。它们从未同时触发。

查看代码,我只能猜测设备上下文和/或窗口句柄无效。任何接受无效设备上下文的内容都可能表现出奇怪和未定义的行为,包括程序关闭时的错误


确保窗口句柄有效,并且具有有效的设备上下文。还有一个重要的注意事项:对于每个
GetDC
,您应该确保有一个相应的ReleaseDC。

明显的问题是,您是否确定
GetDC(此->窗口句柄)
返回的内容有效?(即窗口句柄是否有效?)。我想知道在这一点上是否有一个有效的设备上下文设置?我的意见是一个坏的DC可能会导致这种情况。我刚刚检查了windowHandle,它似乎确实无效。我不确定这是怎么可能的,因为我刚刚在窗口创建函数中检查了windowHandle的值,它是有效的!OpenGL设置调用直接在窗口设置之后进行。我可能需要看一些创建窗口的代码。确实使用创建时的HWND设置了windowHandle变量吗?必须在创建和此函数之间发生某些事情才能导致该行为。我推测这是严格意义上的C++/Win32(以及Wrangler库)代码(没有MFC/ATL等)?请问什么是编译器和开发环境?如果您愿意,您可以随时使用更多代码编辑您的问题。好的,谢谢您的帮助!我将在上面发布我的窗口创建代码,但我确实找到了它。我将上下文创建函数移动到WM_CREATE下的消息循环中。因此,在创建窗口之后,我使用传递到消息循环中的HWND,并用该HWND替换了windowHandle,现在可以正常工作了。这完全是Visual Studio 2012中的C++/Win32。无需发布更多代码。我将发布一个实际的答案,一个必须有一个有效的设备上下文,否则将发生未定义的行为。我推荐的一件事是,如果您使用GetDC,您也需要在某个地方使用相应的ReleaseDC。我很高兴你至少已经克服了这个错误。