[C++/win32] error bij afsluiten *

Pagina: 1
Acties:

  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
Ik heb een probleem (foutmelding) dat ik niet begrijp. Ik heb tot nog toe alleen als doel een simpele opengl initialisatie te implementeren. Maar ik krijg bij de eerste de beste opengl aanroep al een foutmelding. Eigenlijk is het nog geen opengl aanroep maar een wingdi aanroep. Ik heb een leeg project win32 gemaakt en in de wndproc functie heb ik het volgende toegevoegd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
case WM_CREATE:
    hdc = GetDC(hWnd); // obtain a device context for the window 
    HGLRC    hglrc ; 
    int  iPixelFormat;

    PIXELFORMATDESCRIPTOR pfd = { 
        sizeof(PIXELFORMATDESCRIPTOR),    // size of this pfd 
        1,                                // version number 
        PFD_DRAW_TO_WINDOW |              // support window 
        PFD_SUPPORT_OPENGL |              // support OpenGL 
        PFD_DOUBLEBUFFER,                 // double buffered 
        PFD_TYPE_RGBA,                    // RGBA type 
        24,                               // 24-bit color depth 
        0, 0, 0, 0, 0, 0,                 // color bits ignored 
        0,                                // no alpha buffer 
        0,                                // shift bit ignored 
        0,                                // no accumulation buffer 
        0, 0, 0, 0,                       // accum bits ignored 
        32,                               // 32-bit z-buffer     
        0,                                // no stencil buffer 
        0,                                // no auxiliary buffer 
        PFD_MAIN_PLANE,                   // main layer 
        0,                                // reserved 
        0, 0, 0                           // layer masks ignored 
    };  
             
    // get the device context's best, available pixel format match 
    if((iPixelFormat = ChoosePixelFormat(hdc, &pfd))==0)
    {
        BugLog.ReportError();   
    };


simpel toch? :?

Bij dit klein beetje code krijg ik al een foutmelding. De foutmelding krijg ik op het moment dat ik het programma afsluit en de debugger springt dan naar crt0dat.c en bij de regel code
ExitProcess(status);
en krijg ik de foutmelding:
Unhandled exception at 0x77f510a2 in abc.exe: 0xC0000008: An invalid HANDLE was specified.

Hellup! (I feel stupid)

All your quantifications are belong to me!


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Probeer eens te kijken of GetDC(hWND) wel een valid handle is met
C:
1
2
if( !hdc )
  //error!

  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
handle != 0

verder geeft ook geen enkele functie in mijn programma (dat oorspronkelijk veel groter was) een foutmelding. Ik kan gewoon opengl device contexts aanmaken en releasen zonder dat er een foutmelding optreedt.
Alleen bij het afsluiten en debuggen geeft het programma de foutmelding (dus wanneer ik het programma start buiten VS krijg ik geen foutmelding).

All your quantifications are belong to me!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

hmm, wazig
hoe sluit je je app af eigenlijk?

dit zijn overigens mijn init en destroy functies:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void initGL (HWND hWnd, HDC & hDC, HGLRC & hRC)
{
    PIXELFORMATDESCRIPTOR pfd;
    int iFormat;
    
    hDC = GetDC (hWnd);
    
    ZeroMemory (&pfd, sizeof (pfd));
    pfd.nSize = sizeof (pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 24;
    pfd.iLayerType = PFD_MAIN_PLANE;
    iFormat = ChoosePixelFormat (hDC, &pfd);
    SetPixelFormat (hDC, iFormat, &pfd);
    
    hRC = wglCreateContext (hDC);
    wglMakeCurrent (hDC, hRC);
}

void destroyGL (HWND hWnd, HDC hDC, HGLRC hRC)
{
    wglMakeCurrent (NULL, NULL);
    wglDeleteContext (hRC);
    ReleaseDC (hWnd, hDC);
}


vergeet de inhoud van destroyGL () niet uit te voeren voordat je je app sluit

[ Voor 96% gewijzigd door .oisyn op 30-12-2002 17:10 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
Ik had in mijn programma dezelfde functies uitgevoerd bij destroyGL() zoals in jouw voorbeeld.
Maar ook als ik in mijn programma ALLEEN de code uitvoer die in de probleemstelling staat (waar eigenlijk NIKS in gebeurt) dan nog krijg ik de foutmelding.

All your quantifications are belong to me!


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Edsger schreef op 30 december 2002 @ 17:52:
Ik had in mijn programma dezelfde functies uitgevoerd bij destroyGL() zoals in jouw voorbeeld.
Maar ook als ik in mijn programma ALLEEN de code uitvoer die in de probleemstelling staat (waar eigenlijk NIKS in gebeurt) dan nog krijg ik de foutmelding.
Dat lijkt me niet zo slim, want je moet een DC die je pakt altijd weer releasen. Gooi anders dat regeltje er eens bij...

  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
verandert op aanraden van SWfreak
mijn WM_CREATE:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
case WM_CREATE:
    {
        hdc = GetDC(hWnd); // obtain a device context for the window 
        HGLRC    hglrc ; 
        int  iPixelFormat;
            PIXELFORMATDESCRIPTOR pfd = { 
            sizeof(PIXELFORMATDESCRIPTOR),    // size of this pfd 
            1,                                // version number 
            PFD_DRAW_TO_WINDOW |              // support window 
            PFD_SUPPORT_OPENGL |              // support OpenGL 
            PFD_DOUBLEBUFFER,                 // double buffered 
            PFD_TYPE_RGBA,                    // RGBA type 
            24,                               // 24-bit color depth 
            0, 0, 0, 0, 0, 0,                 // color bits ignored 
            0,                                // no alpha buffer 
            0,                                // shift bit ignored 
            0,                                // no accumulation buffer 
            0, 0, 0, 0,                       // accum bits ignored 
            32,                               // 32-bit z-buffer     
            0,                                // no stencil buffer 
            0,                                // no auxiliary buffer 
            PFD_MAIN_PLANE,                   // main layer 
            0,                                // reserved 
            0, 0, 0                           // layer masks ignored 
        };  
         
        // get the device context's best, available pixel format match 
        if(0==(iPixelFormat = ChoosePixelFormat(hdc, &pfd)))
        {
            ShowError();
        }
        if(!ReleaseDC(hWnd, hdc))
        {
            ShowError();
        }    
    }
    break;


toch blijft de foutmelding bij het afsluiten van mijn programma bestaan.
Voor het geval het nog niet duidelijk was. De trigger van de foutmelding is de aanroep van de procedure ChoosePixelFormat en iedere andere functie uit dezelfde library. Het viel namelijk op de het programma alleen maar crashte bij het afsluiten (tijdens het debuggen) als tijdens het draaien van het programma bepaalde libraries werden geladen. Dit gebeurde op het moment dat voor het eerst of ChoosePixelFormat werd aangeroepen (en als deze in commentaar werd gezet) of anders SetPixelFormat.

All your quantifications are belong to me!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

welke class styles heeft de window van wie je de DC opvraagt?
Je moet iig als class style CS_OWNDC opgeven. ReleaseDC () is dan ook niet nodig, aangezien dan niet steeds een nieuwe DC wordt aangemaakt als je GetDC () aanroept.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
Ik had niet als class style CS_OWNDC opgegeven. Het stond nog volgens de VC standaard. Echter na het invullen van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
WNDCLASSEX wcex;
wcex.cbSize                             = sizeof(WNDCLASSEX); 
wcex.style                  = CS_HREDRAW | CS_VREDRAW | S_OWNDC;
wcex.lpfnWndProc                    = (WNDPROC)WndProc;
wcex.cbClsExtra     = 0;
wcex.cbWndExtra     = 0;
wcex.hInstance      = hInstance;
wcex.hIcon      = LoadIcon(hInstance, (LPCTSTR)IDI_ABC);
wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName   = (LPCTSTR)IDC_ABC;
wcex.lpszClassName  = szWindowClass;
wcex.hIconSm        = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

Kreeg ik nog steeds de foutmelding.
Ik ben echter van mening dat de aanroep van ChoosePixelFormat de foutmelding veroorzaakt. Maar ik ben nog een newbie in windows programmeren.
Dus...

All your quantifications are belong to me!


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
probeer eens een Release Build. Ik had ook veel problemen toen in Met OpenGL debug builds deed... Met mij had te maken met de OpenGL drivers ;)

  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
nee een release build mocht ook niet baten ;(

All your quantifications are belong to me!


  • Edsger
  • Registratie: December 2000
  • Laatst online: 02-08 17:39
Ik ben vanmorgen weer vol goede (ahum) moed begonnen met het achterhalen van mijn probleem. Ik ben erachter gekomen dat het probleem niet in mijn code ligt. Ik heb het overbekende "triangle" voorbeeld van de opengl.org website gehaald en deze gecompileerd. Ook hier kreeg ik met debuggen de foutmelding: "Unhandled exception. Invalid handle... BlaDieBla". Dit zet mij echter voor een nog groter raadsel. Waar kan het dan aan liggen? :?
Ik gebruik Visual Studio.Net onder Windows XP met DirectX 9. Verder heb ik de standaard bibliotheken van VS.Net. Heeft iemand hetzelfde probleem als ik? 8)7

All your quantifications are belong to me!

Pagina: 1