Windows 10 OpenGL BSOD, «ловушка режима ядра»

Итак, я создаю контекст по умолчанию в OpenGL (без расширений) и по какой-то причине, как только мое окно открывается, я BSOD с «Неожиданной ловушкой режима ядра»

Теперь это обычное значение по умолчанию. Поскольку я только что использовал запускаемое приложение win32 сообщества VS 2015 и дословно применил контекстный код OpenGL. Что включает в себя окно сообщения, которое якобы должно показать мне мою версию OpenGL (4.4). Однако он открывается пустым, и при закрытии, когда он должен открыть окно OpenGL CS_DCOWN, я BSOD.

Просто интересно, есть ли у кого-нибудь представление о том, какая команда конкретно вызывает BSOD, или мой неправильные методы?

Я в основном работаю с Direct3D9.

  #include "stdafx.h" #include "PureGL.h" #  include  #pragma comment (lib, "opengl32.lib"); # define MAX_LOADSTRING 100//Глобальные переменные: HINSTANCE hInst; //текущий экземпляр WCHAR szTitle [MAX_LOADSTRING]; //Текст строки заголовка WCHAR szWindowClass [MAX_LOADSTRING]; //имя класса главного окна//Перенаправлять объявления функций, включенных в этот модуль кода: ATOM MyRegisterClass (HINSTANCE hInstance); BOOL InitInstance (HINSTANCE, int); LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); int APIENTRY wWinMain  (_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) {UNREFERENCED_PARAMETER (hPrevInstance);  UNREFERENCED_PARAMETER (lpCmdLine); //TODO: поместите сюда код. //Инициализируем глобальные строки LoadStringW (hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);  LoadStringW (hInstance, IDC_PUREGL, szWindowClass, MAX_LOADSTRING);  MyRegisterClass (hInstance); //Выполните инициализацию приложения: if (! InitInstance (hInstance, nCmdShow)) {return FALSE;  } HACCEL hAccelTable = LoadAccelerators (hInstance, MAKEINTRESOURCE (IDC_PUREGL));  MSG msg; //Основной цикл сообщений: while (GetMessage (& msg, nullptr, 0, 0)) {if (! TranslateAccelerator (msg.hwnd, hAccelTable, & msg)) {TranslateMessage (& msg);  DispatchMessage (& сообщение);  }} return (int) msg.wParam;} ATOM MyRegisterClass (HINSTANCE hInstance) {WNDCLASSEXW wcex;  wcex.cbSize = sizeof (WNDCLASSEX);  wcex.style = CS_OWNDC |  CS_HREDRAW |  CS_VREDRAW;  wcex.lpfnWndProc = WndProc;  wcex.cbClsExtra = 0;  wcex.cbWndExtra = 0;  wcex.hInstance = hInstance;  wcex.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_PUREGL));  wcex.hCursor = LoadCursor (nullptr, IDC_ARROW);  wcex.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);  wcex.lpszMenuName = MAKEINTRESOURCEW (IDC_PUREGL);  wcex.lpszClassName = szWindowClass;  wcex.hIconSm = LoadIcon (wcex. hInstance, MAKEINTRESOURCE (IDI_SMALL));  return RegisterClassExW (& wcex);} BOOL InitInstance (HINSTANCE hInstance, int nCmdShow) {hInst = hInstance; //Сохранение описателя экземпляра в нашей глобальной переменной HWND hWnd = CreateWindowW (szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);  если (! hWnd) {вернуть ЛОЖЬ;  } ShowWindow (hWnd, nCmdShow);  UpdateWindow (hWnd);  return TRUE;} LRESULT CALLBACK WndProc (HWND hWnd, сообщение UINT, WPARAM wParam, LPARAM lParam) {PIXELFORMATDESCRIPTOR pfd = {sizeof (PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW |  PFD_SUPPORT_OPENGL |  PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, PFD_MAIN_PLANE, 0, 0, 0, 0};  HDC ourWindowHandleToDeviceContext = GetDC (hWnd);  int letWindowsChooseThisPixelFormat;  letWindowsChooseThisPixelFormat = ChoosePixelFormat (ourWindowHandleToDeviceContext, & pfd);  SetPixelFormat (ourWindowHandleToDeviceContext, letWindowsChooseThisPixelFormat, & pfd);  HGLRC ourOpenGLRenderingContext = wglCreateContext (ourWindowHandleToDeviceContext);  wglMakeCurrent (ourWindowHandleToDeviceContext, ourOpenGLRenderingContext);  MessageBoxA (0, (char *) glGetString (GL_VERSION), «OPENGL VERSION», 0);  wglDeleteContext (ourOpenGLRenderingContext);  PostQuitMessage (0);  переключатель (сообщение) {case WM_COMMAND: {int wmId = LOWORD (wParam); //Анализируем выбранные пункты меню: switch (wmId) {case IDM_EXIT: DestroyWindow (hWnd);  перерыв;  по умолчанию: return DefWindowProc (hWnd, message, wParam, lParam);  } } перерыв;  case WM_PAINT: {PAINTSTRUCT ps;  HDC hdc = BeginPaint (hWnd, & ps); //ЗАДАЧА: Добавьте сюда любой код рисования, который использует hdc ... EndPaint (hWnd, & ps);  } перерыв;  case WM_DESTROY: PostQuitMessage (0);  перерыв;  по умолчанию: return DefWindowProc (hWnd, message, wParam, lParam);  } return 0;}  

Сведения об оборудовании, если известны проблемы — AMD FX 6300, ASUS Radeon R9-285


Насколько Я понимаю, что GetDC должен завершиться ошибкой, потому что для этого окна еще не создана клиентская область — первое сообщение в окне — это WM_NC_CREATE , и это слишком рано для клиента манипулирование областью.

Вы можете выполнять код D3D только после WM_CREATE .

Оцените статью
techsly.ru
Добавить комментарий