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

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 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 如何阻止 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调用约定 背景 我正在动态查找共享库中的符号 获取工厂函数指针和指向我想要调用的某个成员函数的指针 成员函数本身不是虚拟的