从两个不同的C DLL调用两个具有相同名称的函数

Mic*_*haC 8 c windows dll visual-studio-2008

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

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

[编辑]

评论者Ilya在下面问我对GetProcAddress解决方案不喜欢什么.我不喜欢它有两个原因:

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

Mic*_*urr 4

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

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

这是描述 IMPORTS 指令的页面:

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

其他笨拙的替代方案是:

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

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