首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从成员函数的地址调用成员函数

如何从成员函数的地址调用成员函数
EN

Stack Overflow用户
提问于 2012-02-12 19:43:17
回答 2查看 307关注 0票数 1

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

代码语言:javascript
运行
复制
void GameAudio::StopAllSounds(void) // this is at address 0x004A0656

我试过这样称呼它

代码语言:javascript
运行
复制
typedef void(__stdcall * caller)(void);
caller call = (caller)0x004A0656;

我已经用到了所有的东西:__stdcall__cdecl__thiscall等等。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-12 19:47:38

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

代码语言:javascript
运行
复制
class X {
public:
  void foo ();
};
void foo ();

在上面的例子中,X::foo()::foo()是不同的。记住,幕后的X::foo()是这样的:

代码语言:javascript
运行
复制
void X::foo (X* const this);
             ^^^^^ implicitly added

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

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

代码语言:javascript
运行
复制
class X {
public:
  static void foo ();
};
void foo ();

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

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

代码语言:javascript
运行
复制
typedef void (GameAudio::*caller_type)();
caller_type caller = &GameAudio::StopAllSounds;
GameAudio object;
(object.*caller)();
票数 1
EN

Stack Overflow用户

发布于 2012-02-12 19:54:12

C++中没有适用于您正在做的事情的语法。请注意,该函数甚至可能是虚拟的,因此您可能调用了错误的函数。

最简单的方法是将其更改为/变成/添加一个带有附加GameAudio*参数的非成员函数或静态成员函数。可以使用指向指针的函数轻松地调用该函数。

如果您仍然希望直接调用成员函数,那么最好的选择可能是使用汇编程序。接下来的问题是可移植性:您的解决方案将取决于编译器,因此,架构,甚至可能是ABI版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9248496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档