2017-09-02 69 views
2

我目前調用的函數指針像這樣C++與變量

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

,但我有一個問題,任何量調用函數指針,如果我要調用一個函數指針沒有指定PARAMS什麼?

也就是說,如果我知道該功能位於0x12341234,我知道的參數(INT,INT,BOOL)有沒有辦法讓我把它稱爲是這樣的:

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

,那麼我會打電話功能位於0x12341234這樣

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

從研究,我已經做了,我想我需要與可變參數的工作,雖然我一直沒能想出一個好辦法做到這一點使用可變參數。

+0

爲什麼您需要將原始地址分配給函數指針? –

+0

@NickyC我有一個'附加'到程序過程的插件,然後我使用函數原始地址從插件所附的程序中調用函數。 – thehaxdev

回答

2

你可以做到這一點...

#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'; 
} 

這就是說,要非常小心:如果你調用期望的功能說一張雙人牀和你傳遞一個int,就沒有進行檢查或轉換對於正常的函數調用。如果你沒有在函數類型上使用類型擦除,你可以很容易地爲上面的代碼添加類型安全性,但我猜你會有。