我需要在同一个可执行文件中访问两个 C DLL。我有两个库的头文件和 .LIB 文件。不幸的是,我需要访问的函数子集具有完全相同的名称。到目前为止,我能想到的最佳解决方案是使用 LoadLibrary 加载其中一个 DLL,并使用 GetProcAddress 显式调用其方法。有没有办法让我隐式加载这两个库,并以某种方式给编译器一个提示,在一种情况下我想在 DLL A 中调用 OpenApi,在另一种情况下我想在 DLL B 中调用 OpenApi?
我正在使用 Visual Studio 2008 和相应的 C 运行时库 (msvcr90.dll) 在 C++ 中开发可执行文件。
[Edit]
评论者 Ilya 在下面询问我不喜欢 GetProcAddress 解决方案的哪些方面。我不喜欢它有两个原因:
- 它使代码更加复杂。调用函数的一行代码被替换为三行代码,一行定义函数签名,一行调用 GetProcAddress,一行实际调用函数。
- 它更容易出现运行时错误。如果我拼错了函数名称或弄乱了签名,那么直到运行时我才会看到错误。假设我决定集成 dll 的新版本,并且其中一个方法名称已更改,它将编译得很好,并且在实际调用 GetProcAddress 之前不会出现问题,甚至可能在测试通过中错过。
过去,您可以使用链接器 .def 文件“重命名”导入的符号。您可能仍然可以,但是自从 .def 文件被广泛使用以来已经很长时间了,很难找到文档。
当前的 MSDN 文档将 IMPORTS 指令列为“保留关键字”。我不确定这是否意味着他们删除了该功能,或者他们只是不想再支持它。
这是描述 IMPORTS 指令的页面:
http://www.digitalmars.com/ctg/ctgDefFiles.html#imports http://www.digitalmars.com/ctg/ctgDefFiles.html#imports
其他笨拙的替代方案是:
为冲突的 API 创建包装函数。这些功能可以做到LoadLibrary()/GetProcAddress()
舞蹈。所有其他不冲突的函数都可以正常隐式链接。实际上,这个解决方案可能是这个答案中 3 个解决方案中最不笨拙的一个。
创建 2 个包装 DLL,使每个包装器仅链接到一个或另一个具有冲突名称的库。在包装器 DLL 中使用不同的名称,这些名称只是简单地调用真实的库。请注意,包装器库不需要包装所有 API - 它们只需要包装冲突的 API。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)