c++ - SwapBuffers 使我的程序崩溃!

标签 c++ winapi opengl

我有一个 OpenGL 程序可以在我所有的计算机上运行,​​但只有一台。这是一款配备 Vista 64 和 Radeon HD4850 的台式机。问题似乎出在我对 SwapBuffers(hdc) 的调用中。

它编译得很好,然后给我一个异常:

Program.exe 中 0x00000000 处的未处理异常:0xC0000005:访问冲突。

在调用 SwapBuffers 之前使用 VC++ 中断显示 hdc 的值为:

0xfe011734 {未使用=???} CXX0030: 错误:无法计算表达式

有人知道会发生什么吗?从一台 PC 到另一台 PC,SwapBuffers 有什么变化吗?我已经让它在 XP32、XP64 和(不同的)Vista64 上工作。

while (!quit)
    {
        if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
        {
            if (msg.message == WM_QUIT)
                quit = true;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        renderFrame();  //draws the scene

        SwapBuffers(hdc);

        if (GetAsyncKeyState(VK_ESCAPE))
            shutdown();

        think();        //calculates object positions, etc.
    } 

有问题的系统 (HD4850) 上的驱动程序是最新的。我已经在另一个配备 Radeon HD4870 的 Vista64 系统上运行并编写了该程序,该系统也配备了最新的驱动程序。据我所知,这两张卡的驱动程序几乎相同,因为它们都在 HD48xx 系列中。因此,GPU 导致问题似乎很奇怪。

无论如何,我错了还是这是内存问题? (访问冲突)

此外,如果我删除对 SwapBuffers(hdc) 的调用,程序似乎运行良好,尽管没有绘制任何内容,当然,因为帧缓冲区永远不会被交换。但至少是稳定的。

调用堆栈(-> 是堆栈指针):

    ATKOGL32.dll!6aef27bc()     
    opengl32.dll!665edb2d()     
    opengl32.dll!665f80d1()     
    gdi32.dll!75e14104()    
->   MyProg.exe!WinMain(HINSTANCE__ * hinstance=0x009a0000, HINSTANCE__ * hprevinstance=0x00000000, char * lpcmdline=0x003b4a51, int nshowcmd=1)  Line 259 + 0xe bytes
    MyProg.exe!__tmainCRTStartup()  Line 578 + 0x35 bytes
    MyProg.exe!WinMainCRTStartup()  Line 400
    kernel32.dll!7641e3f3()     
    ntdll.dll!777dcfed()    
    ntdll.dll!777dd1ff()    

这是程序集(-> 是下一条要执行的指令):

            SwapBuffers(hdc);
    009B1B5C  mov         esi,esp 
    009B1B5E  mov         eax,dword ptr [hdc (9BF874h)] 
    009B1B63  push        eax  
    009B1B64  call        dword ptr [__imp__SwapBuffers@4 (0E1040Ch)] 
->  009B1B6A  cmp         esi,esp 
    009B1B6C  call        @ILT+780(__RTC_CheckEsp) (9B1311h) 

最佳答案

看起来你可以在窗口被销毁后访问 HDC,如果你一收到 WM_QUIT 就跳出循环,问题会消失吗?

关于c++ - SwapBuffers 使我的程序崩溃!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/668325/

相关文章:

c++ - SSBO 绑定(bind)点索引可以是任何值吗?

c++ - 通过曲面 segmentation 着色器将数据传递到片段着色器

c++ - 在 C++ 中连接套接字时出错

c++ - Win32 异步套接字基本问题

c - 如何不阻止设备被弹出/安全移除?

java - OpenGL-JOGL 颜色

c++ - 如何从另一个线程唤醒没有超时时间的 Select 调用

C++ 为子类重载运算符 <<

c++ - EnumProcesses() 与 CreateToolhelp32Snapshot()

c++ - 如何在 Windows 10 上从提升的管理员上下文启动非提升的管理员进程?