2017-09-02 1 views
2

ich zur Zeit Funktionszeiger nenne wie soC++ Aufruf Funktionszeiger mit jeder Menge Variablen

int(*function)(int a, int b, bool c) = (int(*)(int, int, bool))0x12341234; 

Aber ich habe ein Problem, wenn ich ohne Angabe params einen Funktionszeiger aufgerufen werden soll?

dh, wenn ich weiß, dass die Funktion bei 0x12341234 befindet, und ich weiß, dass die Parameter (int, int, bool) ist es eine Möglichkeit, so könnte ich es so etwas nennen:

void callFunctionUsingMemAddress(int funcaddr, ...) 
{ 
    executefunction(funcaddr, ...); 
} 

dann würde ich nennen Funktion bei 0x12341234 wie dieser sich

callFunctionUsingMemAddress(0x12341234, 54, 77, false); 

Von der Forschung, die ich getan habe, ich glaube, ich muss mit variadische Argumente arbeiten, obwohl ich nicht in der Lage gewesen, eine gute Möglichkeit, um herauszufinden, diese mit variadische Argumente zu tun.

+0

Warum müssen Sie einem Funktionszeiger eine unformatierte Adresse zuweisen? –

+0

@NickyC Ich habe ein Plugin, das an einen Programmprozess "anfügt", dann rufe ich Funktionen aus dem Programm, an das das Plugin angehängt ist, mit den Funktionen rohe Adressen. – thehaxdev

Antwort

2

Sie können es tun ...

#include <iostream> 

int f(int a, int b, bool c) 
{ 
    return c ? a + b : a - b; 
} 

template <typename R, typename... Args> 
R callFunctionUsingMemAddress(void* funcaddr, Args... args) 
{ 
    typedef R(*Function)(Args...); 
    Function fnptr = (Function)funcaddr; 
    return fnptr(args...); 
} 
int main() 
{ 
    std::cout << callFunctionUsingMemAddress<int>((void*)f, 42, 10, true) << '\n'; 
    std::cout << callFunctionUsingMemAddress<int>((void*)f, 42, 10, false) << '\n'; 
} 

Das heißt, sehr vorsichtig sein: Wenn die Funktion, die Sie erwartet, sind den Aufruf einer Doppel sagen und Sie passieren eine int, gibt es keine Kontrollen oder Umwandlungen durchgeführt werden wie für einen normalen Funktionsaufruf. Sie könnten dem oben genannten Code leicht Sicherheit hinzufügen, wenn Sie nicht Typ löschen über den Funktionstyp verwendet haben, aber ich vermute, dass Sie haben werden.