Fenster-Klasse
-
Hi,
ich wollte zur Übung eine kleine Fenster-Klasse programmieren und stoße nun auf folgendes Problem:
Meine Klasse enthält eine WNDCLASSEX-Struktur, die unbedingt die Adresse der Callback-Funktion kennen muss. Dieses Problem wollte ich per Übergabe eines Funktionszeiger an den Konstruktor lösen:class Fenster { WNDCLASSEX wnd; Fenster(..., LRESULT CALLBACK (*WProc)(HWND, UINT, WPARAM, LPARAM),...) { ... wnd.lpfnWndProc = WProc; ... } };Nun zeigt mir der Compiler beim Instanzieren eines Objektes immer folgende Fehlermeldung:
'Cannot convert from 'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)' to 'LRESULT (__cdecl *(__stdcall *)(void))(HWND,UINT,WPARAM,LPARAM)'
Wobei ich das Objekt so erstellen tue:
Fenster f1(..., WindowProc,...);Wie kann ich das Problem lösen bzw. was heißt __cdecl?
-
Wer im richtigen Forum postet, kriegt hier in der Regel auch Antworten...
-
Wer im richtigen Forum postet, kriegt hier in der Regel auch Antworten...
Naja, das Problem liegt hier doch vermutlich eher im sprachspezifischen Bereich(Funktionszeiger). Daher nahm ich an, dass es ok ist, wenn ich ins C++-Forum poste. Dass die Strukturen/Funktionen jetzt aus der WinAPI entnommen sind hielt ich hier nicht für wesentlich. Das Problem lässt sich vermutlich auch auf andere (nicht WINAPI-Strukturen) übertragen. Darum habe ich hier gepostet

-
Zeig mal deine WindowProc her.
Generel heissen die __cdecl, __stdcall etc. Aufruf Konvention (Calling Convention) und gibt an wie die Funktion genau aufgerufen werden muss. Im wesentlichen betrifft das die Zuständigkeit den Stack aufzuräumen.
Wichtig ist, dass die Funktionen mit der Calling Convention aufgerufen wird, mit der sie deklariert sind.
Das CALLBACK Makro gibt bei WinAPI Funktionen die eine Calling Convention an. Wie auch z.B. das WINAPI Makro.
Vielleicht helfen dir diese Infos.
Grüsse
Simon