c++ - 如何从他们的地址调用成员函数

标签 c++ pointer-to-member member-functions

我有一个驻留在应用程序类中的函数,我的目标是将一个 dll 注入(inject)目标进程并通过其地址调用该成员函数。 这是函数:

void GameAudio::StopAllSounds(void) // this is at address 0x004A0656

我试过这样调用它

typedef void(__stdcall * caller)(void);
caller call = (caller)0x004A0656;

我已经使用了所有东西:__stdcall__cdecl__thiscall 随便你说。

最佳答案

类的非static 成员函数签名与普通函数不同。 例如,

class X {
public:
  void foo ();
};
void foo ();

在上面的例子中,X::foo()::foo() 彼此不同。请记住,引擎盖下的 X::foo() 有点像:

void X::foo (X* const this);
             ^^^^^ implicitly added

因此,您尝试执行的操作会导致未定义的行为

如果您坚持使用其地址调用成员函数,那么最好将其设为static 成员函数。

class X {
public:
  static void foo ();
};
void foo ();

X::foo()::foo() 的签名相同。

编辑:从您的评论来看,您似乎无法控制源代码。我建议对函数签名使用正确的调用约定而不是硬编码地址。伪代码

typedef void (GameAudio::*caller_type)();
caller_type caller = &GameAudio::StopAllSounds;
GameAudio object;
(object.*caller)();

关于c++ - 如何从他们的地址调用成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9248496/

相关文章:

c++ - boost::mpi 阻塞 IO 不会被 linux 信号中断

c++ - OpenCV:归一化太慢或者我做错了?

c++ - 如何使用 std::ostringstream 截断整型的宽度?

c++ - 传递成员函数作为参数/c++

c++ - C++ 新手的类成员函数

c++ - 具有所有属性 const 的类是否也需要将成员函数声明为 const?

java - C/objC/C++/Java 编译器

c++ - 更改C++中成员函数的地址

c++ - 具有虚拟性的多级层次结构可防止强制转换函数指针

c++ - 应该声明哪些必要的特殊成员函数?