Nicht ganz triviales Funktionszeigerproblem
-
Hi,
ich hab mal ne ganz dumme Frage, sie hat eigentlich mehr mit der Syntax von C++ zu tuen, aber ich finde nirgendswo dazu hilfe, deshalb probier ichs hier mal:Beispiel: Erzeugen eines Fensters
Ich muss irgendwann die Adresse der Callback routine in einer Struktur speichern, das sieht dann so aus:wc.lpfnWndProc = (WNDPROC) WndProc;Mein problem ist jetzt, dass besagte Callback routine in einer Klasse liegt, im Headerfile wie folgt deklariert:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);Beim kompilieren meckert der Kompiler rum, so ginge es ja nun nicht. Auch ein:
wc.lpfnWndProc = (WNDPROC) this->WndProc;brachte keine Verbesserung. Kann mir vielleicht jemand helfen? Ich kann zur not die Routine auch ausserhalb der Klasse implementieren, dann sollte es auch gehen, aber mich würde trotzdem mal interessieren wie man es richtig macht.
-
Du scheinst einen C++-Wrapper für WinAPI basteln zu wollen. Vielleicht helfen Die einige Beispiele weiter:
http://zp.lo3.wroc.pl/cdragan/corner.web?page=winapi
http://www.programmersheaven.com/zone3/cat1130/26603.htm
etc.
-
Erhard, du solltest dir selbst vielleicht mal anschauen was sich hinter den Links verbirgt

Was hat http://www.winapi.net/index.php?inhalt=tipp13 mit dem Topic zu tun?
-
und die beiden anderen Links kommen auf das selbe Produkt raus *lol*
-
Hm, irgendwie helfen mir diese wrapper nicht weiter. Um das Problem nochmal genauer zu beschreiben:
Klasse glwindow mit 2 methoden in der glwrapper.cpp:
LRESULT CALLBACK glwindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){....} BOOL glwindow::CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag){ .... wc.lpfnWndProc = (WNDPROC) WndProc; // <-- funzt nicht .... }Wie man sieht probiere ich in CreateGLWindow() die Adresse der WndProc-Funktion in einer Struktur abzuspeichern, und genau das geht nicht. Weis jemand wie man das korrekt machen kann?
-
Guck in die WinAPI FAQ.
-
Methoden liefern immer den thisptr als Parameter mit.
Mach fuer dein Callback eine normale C Funktion.
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{....}Schau dir dazu noch SetWindowLong an um die entsprechende Instanz dereferenzieren zu koennen und ruf dann deren "pobj->my_callback" mit entsprechenden Parametern auf.
-
Vielleicht bin ich ja zu deumm aber ich verstehe das nicht und habe keine Ahnung wie ich das nun implementieren soll. Im FAQ wird das auch diskutiert habt ihr Recht, und mit diesem API dann zur Laufzeit ne neue WndProc setzen, das klingt logisch, aber ich hab keinen Plan wie ich das implementieren soll. Irgendwie hat man mit C++ nur Ärger, und muss ständig Probleme lösen die bei anderen Sprachen nicht auftreten.

-
Du solltest erstmal das Problem verstehen.
Mach einfach mal vor die Methode ein static. Dann geht es. Wie dann dennoch an den Zeiger auf das Objekt kommt steht in der FAQ.
-
Mh, wenn ich die Methode static mache kann ich nciht mehr auf die Variablen der klasse zugreifen! Und ja in der FAQ steht da was, vonwegen der this ptr ist noch ein zusätzlicher parameter bei dem wndproc und deshalb geht das alles nicht, trtzdem kriege ich dieses Problem nicht in den Griff!
-
Hat denn hier keiner vielleicht ein einfaches Coebeispiel wie man das mit SetWindowLong in WM_CREATE genau macht? Ich meine wenn ich meine eigentliche wndproc static mache wird das ganze doch gar nicht erst kompilieren, weil ich auf variablen innerhalb der Klasse zugreife mit ihr.
-
Wenn du das noch nicht mal verstehst würde ich dein Projekt abbrechen.
-
Du würdest mein projekt abbrechen? Lol, du kennst mich noch nichtmal , also sei nicht so anmaßend.
-
Ich kenn dich zwar nicht, aber du verhälst dich wie ein elender Newbie.
Mit google würdest du schon Beispiele finden, wenn du dir Mühe geben würdest.
-
Ich habe das Problem auch bereits mittels google gelöst, was bin ich nur für ein Newbie, sollte mich was schämen...
-
Endlich!!!!!

-
Dieser Thread wurde von Moderator/in Gerard aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.