2012-09-26 2 views
0

내 응용 프로그램에서 OpenGL 창을 여는 데 문제가 있습니다.CreateWindowsEx() 중단 점으로 인해 실패했습니다

저는 64 비트 콘솔 응용 프로그램을 사용 중이며 그 콘솔 내에서 OpenGL을 그리기위한 또 다른 창을 열고 싶습니다.

CreateWindowEx()에서 호출이 실패하고 "MyApp.exe가 중단 점을 트리거했습니다"라는 오류가 발생했습니다. 다음 코드는 창 자체를 초기화합니다.

bool OpenGL_Display::CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag, int posX, int posY) 
{ 
    GLuint  PixelFormat;   // Holds The Results After Searching For A Match 
    WNDCLASS wc;      // Windows Class Structure 
    DWORD  dwExStyle;    // Window Extended Style 
    DWORD  dwStyle;    // Window Style 
    RECT  WindowRect;    // Grabs Rectangle Upper Left/Lower Right Values 
    WindowRect.left=(long)0;   // Set Left Value To 0 
    WindowRect.right=(long)width;  // Set Right Value To Requested Width 
    WindowRect.top=(long)0;    // Set Top Value To 0 
    WindowRect.bottom=(long)height;  // Set Bottom Value To Requested Height 

    hInstance   = GetModuleHandle(NULL);    // Grab An Instance For Our Window 
    wc.style   = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window. 
    wc.lpfnWndProc  = NULL;     // WndProc Handles Messages 
    wc.cbClsExtra  = 0;         // No Extra Window Data 
    wc.cbWndExtra  = 0;         // No Extra Window Data 
    wc.hInstance  = hInstance;       // Set The Instance 
    wc.hIcon   = LoadIcon(NULL, IDI_WINLOGO);   // Load The Default Icon 
    wc.hCursor   = LoadCursor(NULL, IDC_ARROW);   // Load The Arrow Pointer 
    wc.hbrBackground = NULL;         // No Background Required For GL 
    wc.lpszMenuName  = NULL;         // We Don't Want A Menu 
    wc.lpszClassName = "OpenGL";        // Set The Class Name 

    if (!RegisterClass(&wc))         // Attempt To Register The Window Class 
    { 
     MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
     return FALSE;           // Return FALSE 
    } 

    dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;   // Window Extended Style 
    dwStyle=WS_OVERLAPPEDWINDOW;       // Windows Style 

    AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);  // Adjust Window To True Requested Size 
    HWND hwndC = GetConsoleWindow(); 
    // Create The Window 
    if (!(hWnd=CreateWindowEx( dwExStyle,       // Extended Style For The Window 
           "OpenGL",       // Class Name 
           title,        // Window Title 
           dwStyle |       // Defined Window Style 
           WS_CLIPSIBLINGS |     // Required Window Style 
           WS_CLIPCHILDREN,     // Required Window Style 
           0, 0,        // Window Position 
           WindowRect.right-WindowRect.left, // Calculate Window Width 
           WindowRect.bottom-WindowRect.top, // Calculate Window Height 
           hwndC,        // No Parent Window 
           NULL,        // No Menu 
           hInstance,       // Instance 
           NULL)))        // Dont Pass Anything To WM_CREATE 
    { 
     KillGLWindow();        // Reset The Display 
     MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION); 
     return FALSE;        // Return FALSE 
    } 
} 

그것으로 이어지는 앞의 코드 :

extern "C" __declspec(dllexport) void OpenGLDisplay_Init(int width, int height, int posX, int posY) 
{ 
    oglDisp.Init_Display(width, height, posX, posY); 
} 

void OpenGL_Display::Init_Display(int width, int height, int posX, int posY) 
{ 
    if (!CreateGLWindow("Ophthametrics Live Display", width, height, 24, false, posX, posY)) 
    { 
     throw; 
    } 
} 

거기에 잘못 무슨 일이야? 나도 몰라, 다른 응용 프로그램에 사용했던 코드를 사용하고 있었는데 잘 작동했다. 여기에서는 끔찍하게 실패하지만 (원래 코드에서는 콘솔 애플리케이션이 아니라 콘솔이없는 Win32 애플리케이션이었습니다).

최종 솔루션은 호출되는 DLL에 있고 일단 호출되면 OpenGL을 그리는 창을 만들어야합니다.

+0

'HWND hwndC = GetConsoleWindow();'- 유효한'HWND'를 반환합니까? 또한 부모가 없으면'hwndC' 대신'NULL'을 전달하면됩니다. – slugonamission

+0

예, 유효한 핸들을 반환하고 있습니다. 나는 또한 부모 창으로 NULL을 시도했지만 여전히 매우 동일한 오류가 발생합니다. – SinisterMJ

+2

실제 함수에서 창 프로 시저를 가리키는 경우 어떻게됩니까? – slugonamission

답변

0

"실제 함수에서 창 프로 시저를 가리키면 어떨까요?"

slugo가 작성했습니다.

관련 문제