単純なOpenGLコンテキストを作成しようとしていますが、OpenGL.exeで「未処理例外」のエラーが発生してChoosePixelFormatでプログラムがクラッシュする:0xC0000005:0x00000044という場所を読み取るアクセス違反。 "この同じコードは、しばらく前に働いていましたが、なんらかの理由でもう動作しません。グラフィックドライバを無駄に更新しようとしました。重要なのは、64ビットWindows 7 Home Premium、GeForce 570、Intel Core i7-2600 3,40 GHzです。ChoosePixelFormatアクセス違反の読み取り場所
これは、私はそれがクラッシュした時点までの実行のために使用したコードです:
GLEngine gl(WndProc); //WndProc just calls DefWindowProc
- calls ->
GLEngine::GLEngine(WNDPROC wndproc) { //Initialize class
hRC = NULL;
hDC = NULL;
hWnd = NULL;
fullscreen = false;
active = false;
proc = wndproc;
itemsLength = 0;
currentActive = this;
success = true;
}
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) {
gl.CreateGL2Window("Test", 1300, 900, 8, false, true);
- calls ->
bool GLEngine::CreateGL2Window(char* title, int width, int height, bool internalflag) {
GLuint pixelFormat;
WNDCLASSEX wc;
DWORD dwExStyle;
DWORD dwStyle;
RECT windowRect;
windowRect.left = (long)0;
windowRect.right = (long)width;
windowRect.top = (long)0;
windowRect.bottom = (long)height;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance; //hInstance is NULL here, should it be something else?
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = _T("OpenGL");
wc.hIconSm = NULL;
if(!RegisterClassEx(&wc)) {
MessageBox(NULL, _T("Failed To Register The Window Class."), _T("ERROR"), MB_OK | MB_ICONEXCLAMATION);
return false;
}
hInstance = wc.hInstance; //hInstance isn't NULL anymore
dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle = WS_OVERLAPPEDWINDOW;
AdjustWindowRectEx(&windowRect, dwStyle, false, dwExStyle);
if(!(hWnd = CreateWindowEx(dwExStyle, _T("OpenGL"),
(wchar_t*)title,
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | dwStyle,
0, 0,
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top,
NULL,
NULL,
hInstance,
NULL))) {
DestroyGLWindow();
MessageBox(NULL, _T("Window Creation Error."), _T("ERROR"), MB_OK | MB_ICONEXCLAMATION);
return false;
}
if(!(hDC = GetDC(hWnd))) {
DestroyGLWindow();
MessageBox(NULL, _T("Can't Create A GL Device Context."), _T("ERROR"), MB_OK | MB_ICONEXCLAMATION);
return false;
}
PIXELFORMATDESCRIPTOR pfd2 = { 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,
32,
8,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};
if(!(pixelFormat = ChoosePixelFormat(hDC, &pfd2)) {
GLEngineは、DLLです。重要ではありませんが、情報が傷つけることはありません。
あなたのコードをテストしただけで、最後のif文で私にエラーが発生しません。 – BDL
これは単純なヌルポインタ例外です。おそらくhDCメンバーにアクセスしようとすると死ぬでしょう。だから、ChoosePixelFormat()と呼ばれるように見えますが、まだそれほど得られませんでした。スタックトレースから明らかなはずですが、CreateGL2Windowが表示されますが、ChoosePixelFormatは表示されません。そして、デバッガ、ブレークポイントを設定し、 'this'を検査します。どのように 'gl'が壊れているのかは分かりません。おそらくあなたはそれをシャドーイングしています。 –
@HansPassant私は、ChoosePixelFormat行にブレークポイントを置いて、その行でクラッシュします。また、hDCと&pfd2のどちらもnullでないことが確認されました。コールスタックは、異なるdllがグレー表示されていることを示しています。私にはそれらのシンボルがありません。 (ntdll.dllとappinit_dll.dll) – Hoxy