2017-02-20 23 views
0

単純な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です。重要ではありませんが、情報が傷つけることはありません。

+0

あなたのコードをテストしただけで、最後のif文で私にエラーが発生しません。 – BDL

+0

これは単純なヌルポインタ例外です。おそらくhDCメンバーにアクセスしようとすると死ぬでしょう。だから、ChoosePixelFormat()と呼ばれるように見えますが、まだそれほど得られませんでした。スタックトレースから明らかなはずですが、CreateGL2Windowが表示されますが、ChoosePixelFormatは表示されません。そして、デバッガ、ブレークポイントを設定し、 'this'を検査します。どのように 'gl'が壊れているのかは分かりません。おそらくあなたはそれをシャドーイングしています。 –

+0

@HansPassant私は、ChoosePixelFormat行にブレークポイントを置いて、その行でクラッシュします。また、hDCと&pfd2のどちらもnullでないことが確認されました。コールスタックは、異なるdllがグレー表示されていることを示しています。私にはそれらのシンボルがありません。 (ntdll.dllとappinit_dll.dll) – Hoxy

答えて

0

GetProcAddressで関数のアドレスを取得しましたか?故障したドライバーはこれもクラッシュする可能性があります。 ChoosePixelFormatは、実装され、ドライバ側にエクスポートされるかもしれませんが、エクスポートされない可能性がありますし、システムプロシージャを使用する必要があります。エクスポートされたものは、実装に応じて記述子構造を満たすかどうかを問わず、DescribePixelFormatを呼び出す必要があります。

+0

「アクセス違反実行場所...」のようなエラーはありませんか? – BDL

+0

@BDLアクセス違反はドライバの問題では一般的ですが、一般的にはUBですが、何かが起こる可能性があります – Swift

+2

@Swift:ChoosePixelFormatはgdi32.dllからエクスポートされたGDI関数です。 OpenGL ICDは、エントリーポイントでビジネスに干渉する必要がありません。 – datenwolf

関連する問題