C ++中的OpenGL - 在运行时崩溃

时间:2009-02-18 14:20:16

标签: c++ visual-studio opengl

我正在Visual Studio 2005中使用C ++编写一些OpenGL。

// SetUpOpenGL sets the pixel format and a rendering
// context then returns the RC
HGLRC COpenGLBaseWnd::SetUpOpenGL(HWND hwnd)
{
    static PIXELFORMATDESCRIPTOR pfd = 
    {
        sizeof (PIXELFORMATDESCRIPTOR), // strcut size 
        1,                              // Version number
        PFD_DRAW_TO_WINDOW |    // Flags, draw to a window,
            PFD_DOUBLEBUFFER |    // enable double buffering
            PFD_SUPPORT_OPENGL, // use OpenGL
        PFD_TYPE_RGBA,          // RGBA pixel values
        24,                     // 24-bit color
        0, 0, 0,                // RGB bits & shift sizes.
        0, 0, 0,                // Don't care about them
        0, 0,                   // No alpha buffer info
        0, 0, 0, 0, 0,          // No accumulation buffer
        32,                     // 32-bit depth buffer
        0,                      // No stencil buffer
        0,                      // No auxiliary buffers
        PFD_MAIN_PLANE,         // Layer type
        0,                      // Reserved (must be 0)
        0,                      // No layer mask
        0,                      // No visible mask
        0                       // No damage mask
    };

    pCDC = pWnd->GetDC();
    hDC = pCDC->GetSafeHdc();

    PixelFormatID = ChoosePixelFormat(hDC, &pfd);

    if (!PixelFormatID)
    {
        // catch errors here.
        // If nMyPixelFormat is zero, then there's
        // something wrong... most likely the window's
        // style bits are incorrect (in CreateWindow() )
        // or OpenGl isn't installed on this machine
        //printf("ChoosePixelFormat Failed %d\r\n",GetLastError());
        abort();
        exit(-1);
    }

    if (pfd.dwFlags & PFD_NEED_PALETTE)
    {
        //printf("Choosen Pixel Format requires a palette.\r\n");
        abort();
        exit(-1);
    }

   SetPixelFormat(hDC, PixelFormatID, &pfd);

那个SetPixelFormat调用是在运行时发出的声音。令人讨厌的是,它只会在我的机器上崩溃,而不是在我的同事身上崩溃。

我在stackoverflow上找到了相似的this answer,但我不知道如何使用C ++中的这些信息解决问题,或者它不是同一个问题。

我需要有关如何在C ++或其他潜在解决方案中实现该解决方案的建议。

3 个答案:

答案 0 :(得分:1)

确保在创建窗口类时未指定CS_PARENTDCCS_OWNDC为。

SetPixelFormat()是否检测到DC是共享的(混淆上述任何一个标志的效果)我不知道,但OpenGL将无法正常工作,除非窗口具有专用的hDC值。

答案 1 :(得分:0)

检查指针是否为NULL。

您的视频卡可能不支持指定的像素格式。尝试其他设置。 你有什么显卡?与其工作的另一个相比。

pWnd来自哪里?

答案 2 :(得分:0)

您提到了链接器错误和崩溃。你能检查你的目标文件是否有崩溃功能的定义吗?您使用正确的lib链接OpenGL吗?