Я пытаюсь создать окно OpenGL на платформе x64.
Мой код инициализации работает для x86 / Win32, но не работает для x64 в «wglMakeCurrent». Я предполагаю, что проблема либо в настройке пиксельного формата, либо в получении DC (getDC ()). Я уже пробовал разные настройки для своего PIXELFORMATDESCRIPTOR (предполагается, что реализация OpenGL для x64 не поддерживает ту, которую я использую), но там не получилось. Отладчик указывает, что hdc может быть поврежден (например, 0xfffffffff10102e0), однако тогда wglCreateContext возвращает корректно выглядящий hglrc (то есть 0x0000000000010000). Но даже если я изменю значение с hdc «на лету» на 0x0000000010102e0 (с использованием отладчика до вызова wglCreateContext), wglMakeCurrent по-прежнему не работает.
Я на Windows 8 с Visual Studio 12 RC 1.
Есть идеи, что я здесь делаю не так? Или, может быть, есть некоторые ограничения в реализации OpenGL для x64?
#include <windows.h>
#pragma comment(lib, "OpenGL32.lib")
static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (uMsg){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
WNDCLASSEX wc;
ZeroMemory(&wc, sizeof(WNDCLASSEX));
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = WindowProc;
wc.hInstance = nullptr;
wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = "WindowClassTest";
RegisterClassEx(&wc);
DWORD dwStyle = WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU;
RECT WindowRect;
WindowRect.left = (long)0;
WindowRect.right = (long)640;
WindowRect.top = (long)0;
WindowRect.bottom = (long)480;
AdjustWindowRect(&WindowRect, dwStyle, FALSE);
HWND hWnd = CreateWindowEx(0,
"WindowClassTest",
"WindowTitle",
dwStyle,
0, 0,
WindowRect.right - WindowRect.left,
WindowRect.bottom - WindowRect.top,
nullptr,
nullptr,
wc.hInstance,
(LPVOID) nullptr);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
ShowWindow(hWnd, SW_SHOW);
SetFocus(hWnd);
HDC hdc = GetDC(hWnd);
int pf;
PIXELFORMATDESCRIPTOR pfd;
memset(&pfd, 0, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pf = ChoosePixelFormat(hdc, &pfd);
if (pf == 0) {
MessageBox(NULL, "ChoosePixelFormat() failed: ""Cannot find a suitable pixel format.", "Error", MB_OK);
}
if (SetPixelFormat(hdc, pf, &pfd) == FALSE) {
MessageBox(NULL, "SetPixelFormat() failed: ""Cannot set format specified.", "Error", MB_OK);
}
DescribePixelFormat(hdc, pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
HGLRC hglrc = wglCreateContext(hdc);
if (!wglMakeCurrent(hdc, hglrc)){
MessageBox(NULL, "wglMakeCurrent() failed: ""Cannot make context current.", "Error", MB_OK);
}
/* left out other unnecessary code here*/
return 0;
}
Похоже, что это очень специфическая ошибка, возникающая в некоторых случаях при запуске 64-битных приложений OpenGL на виртуальной машине Windows 8.x. На основании доступных отчетов (см. Ниже), это происходит, когда
Я столкнулся с той же проблемой в виртуальной машине Parallels, которая использовалась для компиляции моего приложения для Windows. Временным обходным решением было либо использование 32-битной сборки, либо компиляция для 64-битной с использованием предыдущей версии Visual Studio (я использовал 2010).
Важно отметить, что Windows 8.x, работающая на неэмулируемом оборудовании, не Кажется, это затронуто.
Ссылки на других людей, упоминающих эту проблему:
Других решений пока нет …