从两个不同的 C DLL 调用两个同名函数

2024-03-15

我需要在同一个可执行文件中访问两个 C DLL。我有两个库的头文件和 .LIB 文件。不幸的是,我需要访问的函数子集具有完全相同的名称。到目前为止,我能想到的最佳解决方案是使用 LoadLibrary 加载其中一个 DLL,并使用 GetProcAddress 显式调用其方法。有没有办法让我隐式加载这两个库,并以某种方式给编译器一个提示,在一种情况下我想在 DLL A 中调用 OpenApi,在另一种情况下我想在 DLL B 中调用 OpenApi?

我正在使用 Visual Studio 2008 和相应的 C 运行时库 (msvcr90.dll) 在 C++ 中开发可执行文件。

[Edit]

评论者 Ilya 在下面询问我不喜欢 GetProcAddress 解决方案的哪些方面。我不喜欢它有两个原因:

  1. 它使代码更加复杂。调用函数的一行代码被替换为三行代码,一行定义函数签名,一行调用 GetProcAddress,一行实际调用函数。
  2. 它更容易出现运行时错误。如果我拼错了函数名称或弄乱了签名,那么直到运行时我才会看到错误。假设我决定集成 dll 的新版本,并且其中一个方法名称已更改,它将编译得很好,并且在实际调用 GetProcAddress 之前不会出现问题,甚至可能在测试通过中错过。

过去,您可以使用链接器 .def 文件“重命名”导入的符号。您可能仍然可以,但是自从 .def 文件被广泛使用以来已经很长时间了,很难找到文档。

当前的 MSDN 文档将 IMPORTS 指令列为“保留关键字”。我不确定这是否意味着他们删除了该功能,或者他们只是不想再支持它。

这是描述 IMPORTS 指令的页面:

http://www.digitalmars.com/ctg/ctgDefFiles.html#imports http://www.digitalmars.com/ctg/ctgDefFiles.html#imports

其他笨拙的替代方案是:

  1. 为冲突的 API 创建包装函数。这些功能可以做到LoadLibrary()/GetProcAddress()舞蹈。所有其他不冲突的函数都可以正常隐式链接。实际上,这个解决方案可能是这个答案中 3 个解决方案中最不笨拙的一个。

  2. 创建 2 个包装 DLL,使每个包装器仅链接到一个或另一个具有冲突名称的库。在包装器 DLL 中使用不同的名称,这些名称只是简单地调用真实的库。请注意,包装器库不需要包装所有 API - 它们只需要包装冲突的 API。

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

从两个不同的 C DLL 调用两个同名函数 的相关文章

  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐

  • OCJP 考试模拟中的错误:真正创建了多少个对象? [复制]

    这个问题在这里已经有答案了 在 OCJP 认证的模拟中 我发现了这个问题 1 StringBuffer s1 new StringBuffer abc 2 StringBuffer s2 s1 3 StringBuffer s3 new S
  • 如何动态地将行转换为列 SQL Server

    我有一个返回类似以下内容的请求 Tool Week Value Test 20 3 Sense 20 2 Test 19 2 我希望我的输入看起来像这样 Tool W20 W19 Test 3 2 Sense 2 null 基本上 每周我都
  • 如何在 Interface Builder 中使用 UIScrollView?

    虽然我用过UIScrollView过去通过以编程方式成功地操作它 我很难通过在 Interface Builder 中专门设置它来使其工作 我的 iPhone 应用程序中有一个简单的 关于 页面 它有一个UITextView 一些图标以及指
  • 如何将光标置于文本区域的开头

    我找到了一些关于如何将光标放在文本末尾的文本区域中的资源 但我无法找到一种简单的方法来使其出现在开头 我正在用一些文本预先填充文本区域 只是想让用户更容易 将对文本区域的引用传递给此 JS 函数 function resetCursor t
  • 带 @JsonIgnore 的属性和不带注释的属性有什么区别?

    考虑下面的类 private static class Widget JsonProperty private String id ID JsonIgnore private String jsonIgnored JSON IGNORED
  • 使用 MinGW 在 Windows 上编译小型 Gcc 项目

    所以我用 C 编程已经快两年了 一直以来我很高兴使用具有可爱的项目设置和自动链接等功能的 IDE VS 我总是远离任何需要我通过 makefile 进行编译的外部库 或者至少是那些适用于 Linux 环境 其他编译器的库 无论如何 我现在想
  • document.getElementById 方法在哪里定义?

    注 本文仅用于学习目的 console log this document getElementById function alert testing document getElementById someID 我写了上面一段javasc
  • 设计注册确认

    我的项目中有一个用户和一个管理员角色 我使用 Devise 创建了身份验证 在我的管理员角色中 我没有任何确认 在我的用户模型中 我有以下内容 devise database authenticatable confirmable reco
  • Julia 转置 DataFrame 中的分组数据?

    ds Dataset group repeat 1 3 inner 2 b repeat 1 2 inner 3 c repeat 1 1 inner 6 d repeat 1 6 inner 1 e string a f 在inmemor
  • java.io.IOException:没有这样的文件或目录(保存图像)

    我将从设备中选择的照片上传到 ftp 但是 尽管我从设备中选择了照片 但我收到 没有这样的文件目录 错误 虽然我授予应用程序权限 但它不会将其保存到我在应用程序中选择的 IMAGE DIRECTORY 中 所以我收到这个错误 尽管我授予了权
  • CSS 悬停有时不适用于 svg 路径

    我有一个带有路径的 svg 并且我将 css 悬停在它们上面 但悬停有时有效 有时无效 可能是什么问题 div div
  • .Net中的优先级队列[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找优先级队列或堆数据结构的 NET 实现 优先级队列是比简单排序提供更多灵活性的数据结构 因为
  • 原始指针参数的shared_ptr

    当函数需要char 时 可以传入shared ptr吗 我正在读取整个文本文件 长度 100 并且想要将字符存储到 char 数组中 我使用的天真的方法是这样的 ifstream dictFile fileName size t fileL
  • 如何使用子字符串删除字符串(文件名)的结尾?

    我知道我必须使用 Substring 来删除 但我不知道该怎么做 我需要像这样删除字符串末尾 from C Users myname Pictures shoeImage jpg to C Users myname Pictures 使用以
  • 在Python源代码中使用UTF-8编码[重复]

    这个问题在这里已经有答案了 考虑 cat bla py u unicode d s u encode utf 8 print s python bla py File bla py line 1 SyntaxError Non ASCII
  • WM_GETICON 有时不返回图标句柄

    我试图显示所有窗口标题 包括相应的图标 就像 Windows 任务管理器那样 但这仅在一定程度上有效 尽管我能够获取窗口的标题栏文本 但该图标并不总是可用 为了获得图标 我通过了WM GETICON发消息给SendMessage sourc
  • PIL 图像从 RGB 转换为 YCbCr 结果为 4 个通道而不是 3 个通道,并且行为类似于 RGB

    嗯 标题很不言自明 我有一个图像文件 我想将其分别分成 Y Cb 和 Cr 打开文件后 将其从 RGB 这是打开图像文件时的默认模式 转换为 YCbCr 然后使用 numpy array 将其转换为数组 结果是一个具有 4 个通道的 2D
  • 重定向到 root_url 并返回,除非 @user.activated

    这是我的users controller方法 如果用户未激活 则应重定向 def show user User find params id redirect to root url and return unless user activ
  • android 使用 MapView 滑动水平视图分页

    我有一个 Android 应用程序 其视图包含 3 个页面 用户可以通过滑动手指 向左或向右 水平视图分页 在这些页面之间进行导航 我下载了 android support v4 view ViewPager 并找到了实现滑动部分的方法 这
  • 从两个不同的 C DLL 调用两个同名函数

    我需要在同一个可执行文件中访问两个 C DLL 我有两个库的头文件和 LIB 文件 不幸的是 我需要访问的函数子集具有完全相同的名称 到目前为止 我能想到的最佳解决方案是使用 LoadLibrary 加载其中一个 DLL 并使用 GetPr