【问题标题】:C++ Call function pointer with any amount of variables具有任意数量变量的 C++ 调用函数指针
【发布时间】:2018-02-11 03:31:26
【问题描述】:

我目前正在像这样调用函数指针

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

但是我有一个问题,如果我想调用函数指针而不指定参数怎么办?

即如果我知道该函数位于 0x12341234 并且我知道参数(int、int、bool)有没有办法,所以我可以这样称呼它:

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

然后我会像这样调用位于 0x12341234 的函数

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

根据我所做的研究,我认为我需要使用可变参数,但我还没有找到使用可变参数的好方法。

【问题讨论】:

  • 为什么需要将原始地址分配给函数指针?
  • @NickyC 我有一个“附加”到程序进程的插件,然后我使用函数原始地址从插件附加到的程序中调用函数。

标签: c++ function pointers memory call


【解决方案1】:

你可以做到的......

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

也就是说,要非常小心:如果您调用的函数需要一个 double 并且您传递了一个 int,则不会像普通函数调用那样执行检查或转换。如果你没有在函数类型上使用类型擦除,你可以很容易地为上面的代码添加类型安全,但我猜你会这样做。

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多