使用裸函数指针调用成员函数

2024-02-14

如果您有一个对象和一个指向成员的裸函数指针,那么调用成员函数的最佳方法是什么?本质上我想调用函数指针thiscall调用约定。

背景:我正在动态查找共享库中的符号,获取工厂函数指针和指向我想要调用的某个成员函数的指针。成员函数本身不是虚拟的。我无法控制共享库,我只有二进制文件。

Example:

typedef void * (*GenericFptr)();
GenericFptr lookup(const char *);

class CFoo;

GenericFptr factoryfn(lookup("CFoo factory function"));
CFoo *foo = reinterpret_cast<CFoo *>(factoryfn());

GenericFptr memberfn(lookup("CFoo member function"));

// now invoke memberfn on foo

目前我正在使用union将函数指针转换为指向成员函数的指针。它很丑陋,并且创建了对编译器实现细节的依赖:

class CFoo {
  public: 
  void *dummy() { return 0; }
};
typedef void * (CFoo::*FooMemberPtr)();

union {
  struct {
    // compiler-specific layout for pointer-to-member
    void *x, *y;
    GenericFptr ptr;
  } fnptr;
  FooMemberPtr memberfn;
} f;

f.memberfn = &CFoo::dummy; // init pointer-to-member
f.fnptr.ptr = memberfn;    // rewrite pointer

void *result = (foo->*f.memberfn)();

指向成员函数的指针不能存储在指向函数的指针中,因为它需要更多信息(例如,在多重继承的情况下,可能必须在调用之前将偏移量应用于此)。因此,您不能不了解实现细节。

如果您想要可移植,最简单的方法是让您的库提供执行成员调用的包装函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用裸函数指针调用成员函数 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 当我在组合框中选择一个项目时,如何防止 TextChanged 事件?

    我有一个TextChanged http msdn microsoft com en us library system windows forms control textchanged aspx我的事件ComboBox http msd
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 使用 GCP 的数据存储区时如何区分代码是在模拟器中运行还是在 GKE 中运行

    按照中给出的说明进行操作后 我不确定是否遗漏了任何内容https cloud google com datastore docs tools datastore emulator https cloud google com datasto
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp

随机推荐

  • 如何阻止 Python 在 Microsoft Windows 中执行时立即关闭

    我刚刚上大学 我们将使用 python 我们确实什么也没做 所以我下载了程序并执行了一些打印命令 仅此而已 当我运行我的 py 文件时 print命令 出现后立即关闭 我理解它为什么这样做 它给出了输出 所以它完成了它需要做的事情 但我也理
  • 如何在空手道加特林中每秒加载更多请求

    我正在尝试重用空手道脚本并使用加特林执行负载测试 定义的场景是每秒加载 50 个用户 持续 10 秒 对 500 个用户进行负载测试 但是 gatting 报告中每秒的请求数不超过 20 个请求 如果我做错了什么 请告诉我 执行空手道脚本的
  • 用于测试的内存 MongoDB?

    我正在使用 MongoDB 数据库为我的 NodeJS 应用程序编写一些集成和系统测试 我使用的测试框架是Mocha和Supertest 是否可以将 MongoDB 设置为内存数据库 我只能用它来测试 然后在测试完成后擦除我的所有集合和文档
  • network_mode 和使用 Docker 的网络有什么区别

    我试图使用网络 bridge 加入来自不同的服务 docker compose yml 我收到以下错误 Network scoped alias is supported only for containers in user define
  • 从不拥有锁的线程中解锁锁,或者重新设计以避免这种情况?

    我有一个存档对象 它管理各种字节数组并分发InputStream http java sun com javase 6 docs api java io InputStream htmls and OutputStream http jav
  • 如何使用 kubectl 和 jsonpath 将 configmap 的内容保存到文件中?

    我正在尝试将配置映射的内容保存到本地硬盘上的文件中 Kubectl 支持使用 JSONPath 进行选择 但我找不到仅选择文件内容所需的表达式 configmap 是使用命令创建的 kubectl create configmap my c
  • 禁用 CloudWatch 来监控 Lambda 函数的日志

    有没有可能的方法来禁用 CloudWatch 记录 Lambda 函数的事件 如果可能的话 那么执行此操作的步骤是什么 没有标记 切换 开关或直接方法来禁用 lambda 函数的 CloudWatch 日志 一种解决方法是您可以将以下内联策
  • 自定义身份验证和哈希 Laravel 5.1

    我有一个现有的数据库 users username gt varchar password gt md5 hashing 我是 Laravel 新手 我尝试从 Laravel 创建简单的登录和注册docs http laravel com
  • eclipse(使用 scala 环境设置):对象 apache 不是包 org 的成员

    如图所示 当我导入 Spark 包时出现错误 请帮忙 当我将鼠标悬停在那里时 它显示 对象 apache 不是包组织的成员 我搜索了这个错误 它显示 Spark jars 尚未导入 所以 我也导入了 spark assemble 1 4 1
  • Html.ActionLink 具有指定的 HTML id?

    我想给出用生成的类似Html ActionLink一个 HTML id 这样我就可以根据我所在的位置更改 CSS 我有一个MasterPage带有一组链接 我想通过 Jquery 更改活动 id 的 css 来区分活动 选项卡 现在我正在使
  • 有没有办法为元组项目指定有意义的名称?

    从 a 中检索项目Tuple是通过访问来完成的ItemX财产 有没有一种方法可以命名每个项目 以便使用元组更具可读性 Code 寻找这样的东西 Dim l As New Tuple Of String Integer l Name l ID
  • 使用 Open MPI 运行并行程序时出现分段错误

    在我之前的文章中 我需要在 10 台计算机之间分发 pgm 文件的数据 在 Jonathan Dursi 和 Shawn Chin 的帮助下 我集成了代码 我可以编译我的程序 但出现分段错误 我跑了 但什么也没发生 mpirun np 10
  • TypeScript:构造函数中的位置或命名参数

    我有一个类当前采用 7 个以上的位置参数 class User constructor param1 param2 param3 etc 我想通过选项对象将其转换为命名参数 type UserOptions param1 string cl
  • 如何管理 Rails 引擎 + 虚拟应用程序的迁移

    我刚刚加入了一个开发 Rails 引擎的项目 该项目还有一个用于测试的虚拟应用程序 foo foo spec dummy 存在相同的迁移 foo db migrate foo spec dummy db migrate If I rake
  • 如何捕获 sqlalchemy 上的特定异常?

    我想捕获特定的异常 例如UniqueViolation关于 sqlalchemy 但是 sqlalchemy 只能通过以下方式抛出异常IntegrityError 所以我用下面的代码捕获了特定的异常 except sqlalchemy ex
  • 为什么 Apache 需要 SSLCertificateKeyFile?

    需要 SSLCertificateKeyFile 私钥 的技术原因是什么 它在哪里使用以及用于什么 SSL 证书文件包含 X 509 证书 该证书又包含用于加密的公钥 SSL 证书Key文件包含与证书中的公钥对应的私钥 为了让网络服务器加密
  • 使用特定数字类型而不是其他数字类型有何含义

    将整数存储为特定数字类型 uint8 int16 uint32 int64 等 对内存有何影响 我知道每种类型可以采用的整数范围 但是通过使用适当的类型是否可以实现一定的内存效率 例如 在 Golang 中 将某人的年龄存储为 uint8
  • std::out_of_range 异常不会抛出

    The following code works fine throwing a std out of range exception std vector
  • 了解 sprintf(...) 的危险

    OWASP http www owasp org index php Buffer Overruns and Overflows says C 库函数 例如 strcpy strcat sprintf 和 vsprintf 对以 null
  • 使用裸函数指针调用成员函数

    如果您有一个对象和一个指向成员的裸函数指针 那么调用成员函数的最佳方法是什么 本质上我想调用函数指针thiscall调用约定 背景 我正在动态查找共享库中的符号 获取工厂函数指针和指向我想要调用的某个成员函数的指针 成员函数本身不是虚拟的