Bjarke Dahl Ebert skrev:
> Åh nej, nu bliver vi forvirrede med 2xBjarke ;)
Ja, det går da virkelig ikke! :)
> Jeg forstår dit spørgsmål sådan at du har adressen til en funktion, og du
> ønsker at kalde funktionen.
> Så kalder du den bare, lige som om din pointer-variabel er funktionen.
Rigtig forstået!
> Syntaksen for en funktionspointer er desværre lidt bøvlet, og hvis du får
> adressen fra GetProcAddress, så skal pointeren først castes til den
rigtige
> type.
>
> Bemærk at der under Windows i syntaksen for funktionstypen indgår
> kaldkonventionen (det kan være __cdecl, __fastcall, __stdcall eller
andet).
> Kaldkonventionen siger noget om hvordan funktionen skal kaldes på
> assemblerniveau (hvordan overføres parametre (i registre, eller på stak),
> pushes parametrene på i den ene eller anden rækkefølge, er det funktion
> eller kalder der rydder stakken op, hvilke registre kan formodes bevaret,
> osv.)
Jeg kender godt til dette fra Delphi. Og jeg kender også til det på
assemblerniveau - har programmeret lidt assembler.
Blot en ting: Hvor skal kaldkonventionen skrives? - sådan her: __stdcall
func1=GetProcAdress(...);
.... eller: #define FARPROC __stdcall
Det ville være mest logisk sådan, men måske er det en anden måde??
> Dette, samt manglende typeinformation på link-niveau, er en evig kilde til
> frustrationer
. C++ name-mangling gør ikke situationen specielt meget
> bedre, IMHO.
Ik' for noget, men hvad menes der med name-mangling?
> Fx:
> FARPROC func1 = GetProcAddress(...);
> // Cast til den rigtige funktionspointer-type (den skal man bare kende..
> ;-( )
> void (*func2)(int,int) = (void(*)(int,int))func1;
> // Nu kan vi kalde den:
> func2(42,43); // egentlig (*func2)(42,43), men på den angivne måde
> derefereres automatisk.
>
>
>
> Mvh. Bjarke
Ellers mange tak for dit svar.
Mvh. Bjarke - jeg ved det er forvirende!