如何从成员的地址调用成员函数
How to call member functions from their address
我有一个函数驻留在应用程序的类中,我的目标是将dll注入目标进程,并通过其地址调用该成员函数。以下是功能:
void GameAudio::StopAllSounds(void) // this is at address 0x004A0656
我试过这样称呼它
typedef void(__stdcall * caller)(void);
caller call = (caller)0x004A0656;
我已经使用了所有东西:__stdcall
、__cdecl
、__thiscall
。
class的非static
成员函数签名不同于普通函数。例如,
class X {
public:
void foo ();
};
void foo ();
在上述情况下,CCD_ 5和CCD_ 6彼此不同。请记住,引擎盖下的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++中没有语法来描述您正在做的事情。请注意,该函数甚至可能是虚拟的,因此您可能调用了错误的函数。
最简单的方法是将其更改为/添加一个非成员函数或静态成员函数,并添加一个额外的GameAudio*
参数。使用指向函数的指针可以很容易地调用该函数。
如果您仍然想直接调用成员函数,那么最好的选择可能是使用汇编程序。那么问题是可移植性:您的解决方案将取决于编译器、SO、体系结构,甚至可能取决于ABI版本。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 无法为类成员调用函数
- C++ 类成员调用错误 C3861
- 用const_iterator成员调用类destructor时堆积损坏
- C++ 如何为类的所有成员调用方法
- 通过命名成员调用虚拟与地址或引用的区别
- 使用类成员调用函数
- 正在成员调用中实例化类
- 使用父类中的私有成员调用父构造函数
- 带有类 - 非静态成员调用的 typedef 函数声明
- C++:对非静态成员函数指针的成员调用
- 需要从静态成员调用函数(由静态指针引用)
- 用类成员调用构造函数,c++
- 将luabind派生成员调用为协同程序
- 为什么我没有得到编译错误时,我从const方法内部的ref成员调用非const方法
- 类成员函数正常工作,但当作为另一个类的数据成员调用时陷入无限循环