gelöst: wglGetProcAddress liefert NULL

3D-Visualisierung mit der Open Graphics Library (OpenGL)
Antworten
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8507
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

gelöst: wglGetProcAddress liefert NULL

Beitrag von Xin » Di Feb 15, 2011 12:09 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: wglGetProcAddress

Beitrag von Kerli » Mi Feb 16, 2011 6:31 pm

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.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8507
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wglGetProcAddress

Beitrag von Xin » Mi Feb 16, 2011 6:44 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten