Ich habe ein OpenGL-Programm, das auf allen meinen Computern außer einem funktioniert. Es ist ein Desktop mit Vista 64 und einer Radeon HD4850. Das Problem scheint in meinem Aufruf von SwapBuffers(hdc) zu liegen.
Es kompiliert gut und gibt mir dann eine Ausnahme:
Unbehandelte Ausnahme bei 0x00000000 in Program.exe: 0xC0000005: Zugriffsverletzung.
Die Verwendung von VC++, um vor dem Aufruf von SwapBuffers zu brechen, zeigt den Wert von hdc als:
0xfe011734 {unused=???} CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden
Hat jemand eine Ahnung, was da los sein könnte? Gibt es irgendetwas an SwapBuffers, das sich von einem PC zum nächsten ändern würde? Ich habe es auf XP32, XP64 und einem (anderen) Vista64 zum Laufen gebracht.
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.
}
Die Treiber auf dem problematischen System (HD4850) sind aktuell. Ich habe das Programm auf einem anderen Vista64-System mit einer Radeon HD4870, ebenfalls mit aktuellen Treibern, ausgeführt und geschrieben. Soweit ich weiß, sind die Treiber für diese beiden Karten nahezu identisch, da beide zur HD48xx-Serie gehören. Aus diesem Grund scheint es seltsam, dass die GPU das Problem verursacht.
Wie auch immer, liege ich falsch oder ist das ein Speicherproblem? (Zugriffsverletzung)
Wenn ich außerdem den Aufruf von SwapBuffers(hdc) entferne, läuft das Programm scheinbar gut, obwohl natürlich nichts gezeichnet wird, weil die Framebuffer nie getauscht werden. Aber es läuft zumindest stabil.
Aufruf von Stack (-> ist Stack-Ptr):
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()
Hier ist der Zusammenbau (-> ist die nächste auszuführende Anweisung):
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)