我需要在同一个可执行文件中访问两个C DLL。我有两个库的头文件和.LIB文件。不幸的是,我需要访问的函数的子集具有完全相同的名称。到目前为止,我能够提出的最佳解决方案是使用LoadLibrary加载其中一个DLL并使用GetProcAddress显式调用其方法。有没有办法让我隐式加载两个库,并以某种方式给编译器一个提示,在一种情况下,我想在DLL A中调用OpenApi,在另一种情况下,我想在DLL B中调用OpenApi?
我正在使用Visual Studio 2008和相应的C运行时库(msvcr90.dll)在C ++中开发可执行文件。
[编辑]
评论者Ilya在下面询问我对GetProcAddress解决方案不喜欢的内容。我不喜欢它有两个原因:
答案 0 :(得分:4)
过去,您可以使用链接器.def文件“重命名”导入的符号。你可能还可以,但是.def文件被广泛使用已经很久了,很难找到文档。
当前的MSDN文档将IMPORTS指令列为“保留关键字”。我不确定这是否意味着他们删除了这些功能,或者他们是否只是不想再支持它了。
这是描述IMPORTS指令的页面:
http://www.digitalmars.com/ctg/ctgDefFiles.html#imports
其他kludgy替代方案是:
为冲突的API创建包装函数。这些功能可以进行LoadLibrary()/GetProcAddress()
舞蹈。所有其他非冲突函数可以正常隐式链接。实际上,这个解决方案可能是这个答案中3中最少的一个。
创建2个包装器DLL,使每个DLL仅链接到具有冲突名称的一个或另一个库。在包装器DLL中使用不同的名称,这些名称只是简单地转移到真正的库中。请注意,包装器库不需要包装所有API - 它们只需要包装冲突的API。
答案 1 :(得分:1)
您可以构建新的导入库文件,重命名有问题的函数,然后使用这些新的导入库隐式链接两个DLL模块。以下是介绍该过程的Microsoft知识库文章:How To Create 32-bit Import Libraries Without .OBJs or Source。
答案 2 :(得分:1)
在我对此事进行了一些考虑之后,我设法得到了Mike B的kludgy替代品#2(或者如果算上原来的建议,那么#3)。
对于我的特定情况,这是我最喜欢的三个,因为它似乎需要的工作量最少,并且可能是最明显的解密新代码的人。我相信我可以按照这些步骤启动并运行:
如果有人还在阅读这个帖子,我的后续问题就是:“这个解决方案有什么问题吗?”
感谢响应者的帮助。