У меня есть программа OpenGL, которая работает на всех моих компьютерах, кроме одного. Это настольный компьютер с Vista 64 и Radeon HD4850. Проблема, похоже, в моем вызове SwapBuffers (hdc).
Он отлично компилируется, а затем дает мне исключение:
Необработанное исключение 0x00000000 в Program.exe: 0xC0000005: нарушение доступа.
Использование VC ++ для прерывания перед вызовом SwapBuffers показывает, что значение hdc будет:
0xfe011734 {unused = ???} CXX0030: ошибка: выражение не может быть вычислено
Кто-нибудь знает, что может происходить? Есть ли что-то в 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) установлены актуальные драйверы. Я запустил и написал программу на другой системе Vista64 с Radeon HD4870, также с новейшими драйверами. Насколько мне известно, драйверы для этих двух карт практически идентичны, поскольку обе относятся к серии HD48xx. По этой причине кажется странным, что проблема связана с графическим процессором.
В любом случае, я ошибаюсь или это проблема с памятью? (Нарушение доступа)
Кроме того, если я удалю вызов SwapBuffers (hdc), программа будет работать, казалось бы, хорошо, хотя, конечно, ничего не отображается, потому что буферы кадра никогда не меняются местами. Но как минимум стабильно.
Стек вызовов (-> 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()
Вот сборка (-> это следующая инструкция, которую нужно выполнить):
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)