[ create a new paste ] login | about

Link: http://codepad.org/G33MCpKo    [ raw code | output | fork ]

C++, pasted on Apr 10:
//Funktionsname ist der Name der Funktion (als LPCSTR), Ein LPCSTR ist ein const char*
//DllHandle ist die Rückgabe von LoadLibrary
//HMODULE ist ein HINSTANCE ist ein HANDLE ist ein PVOID ist ein void* (ich gebe die ganze typedef-Hirarchie an, falls du mal irgendwo nachschaust)
//FARPROC schließlich ist ein Funktionszeiger, definiert als "int (WINAPI *FARPROC)()". WINAPI ist ein #define auf "__stdcall". Also musst du noch casten.
FARPROC Rp_FunkZgr = GetProcAddress(HMODULE DllHandle, LPCSTR Funktionsname);
//Beispiel für dich (Angenommen die Funktion gibt einen int* zurück):
FARPROC Rp_FT_Open = GetProcAddress(HMODULE DllHandle, LPCSTR Funktionsname);
int* (*FT_Open)() = reinterpret_cast<int* (*)()>(Rp_FT_Open);
//du kannst auch erst ein typedef machen:
typedef int* (*FT_OPEN_FunkZgr)();
FT_OPEN_FunkZgr = reinterpret_cast<FT_OPEN_FunkZgr>(Rp_FT_Open);
//Wobei FT_OPEN_FunkZgr natürlich für jede Funktion "passt", die einen int* zurückgibt und keine Parameter nimmt.
//Hier ist noch ein kleines Präprozessormakro:
#define GenFnZgr(FName, RZgr, RgW, ParamListe...) RgW (*FName)(ParamListe) = reinterpret_cast<RgW (*)(ParamListe)>(RZgr)
//Aufruf: GenFnZgr(Funktionsname, RoherZeiger, Rueckgabewert, Parameterliste) (die Parameterliste ganz normal angeben,
//also kannst auch die Parameternamen dastehen lassen. Beispiel:
GenFnZgr(FT_OPEN, Rp_FT_OPEN, int*, void); //Das void musst du nicht angeben, aber es ist vielleicht übersichtlicher,
//also hab ichs mal angegeben, achte auch auf den Strichpunkt am Ende
//Und der Aufruf der Funktion ist dann nach allen Varianten einfach:
FT_OPEN();
//Oder
int* Test = FT_OPEN();


Output:
1
2
Line 5: error: 'FARPROC' does not name a type
compilation terminated due to -Wfatal-errors.


Create a new paste based on this one


Comments: