2017-09-02 70 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,就没有进行检查或转换对于正常的函数调用。如果你没有在函数类型上使用类型擦除,你可以很容易地为上面的代码添加类型安全性,但我猜你会有。