C++与变量
问题描述:
我目前调用的函数指针像这样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);
从研究,我已经做了,我想我需要与可变参数的工作,虽然我一直没能想出一个好办法做到这一点使用可变参数。
答
你可以做到这一点...
#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
,就没有进行检查或转换对于正常的函数调用。如果你没有在函数类型上使用类型擦除,你可以很容易地为上面的代码添加类型安全性,但我猜你会有。
为什么您需要将原始地址分配给函数指针? –
@NickyC我有一个'附加'到程序过程的插件,然后我使用函数原始地址从插件所附的程序中调用函数。 – thehaxdev