我有一个驻留在应用程序的类中的函数,我的目标是将dll注入到目标进程中,并通过其地址调用该成员函数。下面是函数:
void GameAudio::StopAllSounds(void) // this is at address 0x004A0656
我试过这样称呼它
typedef void(__stdcall * caller)(void);
caller call = (caller)0x004A0656;
我已经用到了所有的东西:__stdcall
、__cdecl
、__thiscall
等等。
发布于 2012-02-12 19:47:38
类的非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)();
发布于 2012-02-12 19:54:12
C++中没有适用于您正在做的事情的语法。请注意,该函数甚至可能是虚拟的,因此您可能调用了错误的函数。
最简单的方法是将其更改为/变成/添加一个带有附加GameAudio*
参数的非成员函数或静态成员函数。可以使用指向指针的函数轻松地调用该函数。
如果您仍然希望直接调用成员函数,那么最好的选择可能是使用汇编程序。接下来的问题是可移植性:您的解决方案将取决于编译器,因此,架构,甚至可能是ABI版本。
https://stackoverflow.com/questions/9248496
复制相似问题