用内存地址声明函数

Declare function with memory address

我正在尝试通过其内存地址调用一个函数。

我做过类似的事情:

int GetNewValue(int args)
{
  return args * 2;
}

int main()
{
  /*
      Function address: 0x22feac
  */

  int(*GetVal)(int) = 0x22feac; // instead of '&GetNewValue'
}

但是在编译时,我得到以下错误:

[Error] invalid conversion from int to int (*)(int) [-fpermissive]

如何从地址调用方法?

(请注意,上面的示例为简单起见使用常量,但在我的实际代码中,我从 DLL 注入中挂接了一个函数。)

地址0x22feac看起来像普通代码地址space中的任何地址。但这取决于您的环境。在源代码中使用由数字文字指定的地址通常不是一个好主意。

但是可能有一个地址是您从外部获得的,例如来自 Windows 函数 GetProcAddress。如果你确定你真的知道你在做什么,那么你可以将这样的值赋给一个函数指针:

intptr_t functionAddress = 0x22feac;
auto GetVal = reinterpret_cast<int(*)(int)>(functionAddress);

auto 允许您遵循 "Don't repeat yourself" 模式。