Seite 1 von 1

gelöst: wglGetProcAddress liefert NULL

Verfasst: Di Feb 15, 2011 12:09 pm
von Xin
Shalom, ich komme gerade nicht weiter:

Folgender Code...

Code: Alles auswählen

        glWindowPos2i = (void (WINAPI *) (GLint x, GLint Y )) wglGetProcAddress( "glWindowPos2i" );

        if( !glWindowPos2i )
            glWindowPos2i = (void (WINAPI *) (GLint x, GLint Y )) wglGetProcAddress( "glWindowPos2iARB" );

        if( !glWindowPos2i )
        {
            int a = 0;
//            AfxMessageBox( L"OpenGL 1.4 nicht verfügbar" );
        }
Ich bekomme die glWindowPos2i Funktion nicht geliefert, die in OpenGL 1.4 enthalten ist. Die Graka hat 2.1.
Und damit man versteht, warum ich die Frage nicht für google formuliert bekomme: Die Methode funktionierte auf dieser Kiste schon, ich hatte die "glWindowPos2i" schon. Jetzt tut sie es nicht mehr.

Hat jemand eine Idee, wieso ein solches Stück Code irgendwann nicht mehr funktionieren könnte? wglGetProcAddress liefert mir NULL. Was kann passiert sein, dass wglGetProcAddress NULL liefert, obwohl die Graka die Funktion anbietet und auch die aktuellen Treiber drauf sind?

Re: wglGetProcAddress

Verfasst: Mi Feb 16, 2011 6:31 pm
von Kerli
Könnte es denn sein dass du die Funktion schon verfügbar hast und dann mit deinem Funktionsaufruf überschreibst? Ansonsten bekommst du vielleicht mit GetLastError weitere Informationen wo die Fehlerursache liegen könnte.

Übrigens ich verwende für OpenGL Extensions meistens GLee. Hat bis jetzt eigentlich immer gut funktioniert.

Re: wglGetProcAddress

Verfasst: Mi Feb 16, 2011 6:44 pm
von Xin
Ach verdammt, ganz vergessen hier zu antworten...
Kerli hat geschrieben:Könnte es denn sein dass du die Funktion schon verfügbar hast und dann mit deinem Funktionsaufruf überschreibst? Ansonsten bekommst du vielleicht mit GetLastError weitere Informationen wo die Fehlerursache liegen könnte.
Ich bekam ERROR_INVALID_HANDLE von GetLastError().

Ich hatte vorher Probleme mit dem HDC, konnte aber inzwischen an der Stelle aber garantieren, dass der HDC in Ordnung ist. Deswegen verstand ich die Meldung nicht.

Die Lösung war recht einfach: Es gibt eine Routine, die OpenGL initialisiert, aber blöderweise gleich zum Malen auffordert. Beim Malen wurde dann aber auch Text geschrieben und weil es den Font nicht gab, flog einem das Ding um die Ohren. Also musste der Font zuvor initialisiert werden. In dem Bereich wird - für den Font - auch die Adresse der Funktion herausgesucht. Also wurde die Initialisierungsroutine mit dem Draw-Befehl weiter nach hinten verlegt.
Da Text nur zu Debugzwecken geschrieben wird, fiel nicht auf, dass nichts geschrieben wurde, weil nicht die Debug-Version lief. Einige Tage später wollte ich die wieder haben und da war kein Text mehr... Ich erinnerte mich an den Streß mit den HDC, bekam die dazu passende Meldung ERROR_INVALID_HANDLE...

Schlussendlich waren folgende Zeilen in der Init-Routine durch den späteren Aufruf nach hinten gerutscht:

Code: Alles auswählen

	_hrc = wglCreateContext(_hdc);
	wglMakeCurrent(_hdc, _hrc);
Ohne aktiven Rendering-Context, wohl kein wglGetProcAddress(). Also die Init-Routine wieder nach oben, das Draw() rausschmeißen - gezeichnet wird so oder wenige Millisekunden später erneut und alles läuft wieder. Also blöder Fehler, weil ich aufgrund eines anderen Problems noch gedanklich an der falschen Stelle suchte.