从两个不同的 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 调用两个同名函数 的相关文章

  • 如何在 ASP.Net Core 6 Web Api 中依赖注入 Microsoft Graph 客户端

    我正在尝试使用 ASP Net Core 6 设置 Web api 以便用户可以到达我的端点 然后我使用特权帐户在 Teams 中执行一些工作 我认为我没有正确连接 DI 部分 因为在向 Teams 发出请求时出现以下错误 MsalUiRe
  • 进入嵌入式[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ASP.NET MVC 数据注释属性 Range 从另一个属性值设置

    您好 我的 Asp net MVc 模型中有以下内容 测试模型 cs public class TestModel public double OpeningAmount get set Required ErrorMessage Requ
  • 如果我每次创建粒子时都强制重新初始化每个粒子,我是否应该使用粒子池

    我正在 XNA4 中创建一个粒子系统 但遇到了问题 我的第一个粒子系统是一个简单的粒子列表 其实例是在需要时创建的 但后来我读到了有关使用池的内容 我的第二个系统由一个充满粒子的池和一个发射器 控制器组成 我的池非常基本 这是代码 clas
  • Image.FromStream() 方法返回 Invalid Argument 异常

    我正在从智能相机成像器捕获图像 并通过套接字编程从相机接收字节数组 NET 应用程序是客户端 相机是服务器 问题是我在运行时收到 System InvalidArgument 异常 private Image byteArrayToImag
  • std::string substr 方法问题

    你好 我正在写这个方法 我希望它从给定缓冲区中提取给定位置的一部分 我有一个像这样的字符串something one something two我想要得到 一个 这是我的想法 static std string Utils getHeade
  • 用于打开大(巨型、巨大、大)文本文件的文本编辑器[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • IOS Box2D - 身体遵循基于速度波动的点数组的特定路径

    我有一个关于身体的问题 它遵循特定的路径 首先是将身体移动到目标点的方法 const float destinationControl 0 3f b2Vec2 targetPosition path counter b2Vec2 missi
  • ld: 无法对非 PE 输出文件执行 PE 操作错误

    我是操作系统编程的新手 我正在读一本书 其中给出了一个简单的内核示例 如下所示 main char video memory 0xb8000 video memory X 为了编译这个名为 kernel c 的文件 我在 Windows 7
  • 通用 lambda 的数量

    可以通过访问非泛型 lambda 的数量来推断其数量operator template
  • 我们可以向 ServicePointManager.SecurityProtocol 添加四个协议吗?

    我想支持从 ssl3 到 tls 1 2 的所有安全协议 但是在网上搜索时我发现代码为 ServicePointManager SecurityProtocol SecurityProtocolType Ssl3 SecurityProto
  • 如何获取 EF 中的实体更改增量?

    我只需要获取已更改字段的列表 数据存储区是 ssce 因此没有可用的触发器 EF 是否支持获取列表或构建通用组件 根据上下文的类型和生成的实体 您可以通过多种不同的方式来完成此操作 如果对象继承自 Entity 或 POCO 您可以使用Ob
  • 在运行时生成可执行文件

    好吧 所以我想知道如何创建一个程序 该程序创建第二个程序 就像大多数压缩程序如何创建自解压自可执行文件一样 但这不是我需要的 假设我有 2 个程序 每个都包含一个类 我将使用一个程序来修改类并用数据填充类 第二个文件将是一个也具有该类的程序
  • 使用智能指针在大型对象集合中创建多个索引

    我正在为一个大型对象集合创建多个索引 即使用不同的键 对象可以改变 集合可以缩小和增长 到目前为止我的想法 保留某种指向对象的指针的多个集合 使用set代替map以获得更好的封装 使用 unordered set 可以很好地扩展大型数据集
  • 我的 C 程序无法运行,并显示“无法执行二进制文件:Exec 格式错误”

    我刚刚从 C 开始 我试图编译下面的代码并执行它 但出现错误 也在运行sizeBS 或数据堆栈中没有显示任何内容 include
  • GCC编译非常慢(文件大)

    我正在尝试编译一个大的 C 文件 专门用于 MATLAB mexing C 文件大约 20 MB 可用来自 GCC 错误跟踪器 https gcc gnu org bugzilla attachment cgi id 36632如果你想玩一
  • TransactionScope 在某些机器上自动升级到 MSDTC?

    在我们的项目中 我们使用 TransactionScope 来确保我们的数据访问层在事务中执行其操作 我们的目标是not要求在我们的最终用户的计算机上启用 MSDTC 服务 问题是 在我们一半的开发人员机器上 我们可以在禁用 MSDTC 的
  • 即使没有任何转换,也违反了 C 中的严格别名?

    How can i and u i在此代码中打印不同的数字 即使i定义为int i u i 我只能假设我在这里触发了 UB 但我不知道具体是如何触发的 ideone演示 http ideone com Gcv5Xm如果我选择 C 作为语言
  • 删除指针后将其设为 NULL 是一个好习惯吗?

    我首先要说的是 使用智能指针 您将永远不必担心这个问题 下面的代码有什么问题 Foo p new Foo use p delete p p NULL 这是由答案和评论 https stackoverflow com questions 19
  • 布尔实现的atomicCAS

    我想弄清楚是否存在错误答案 https stackoverflow com a 57444538 11248508 现已删除 关于Cuda like的实现atomicCAS for bool是 答案中的代码 重新格式化 static inl

随机推荐

  • 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