c++ - 我可以在同一个进程中使用同一个 DLL 的两个不兼容版本吗?

标签 c++ windows winapi dll

我使用的是同一供应商生产的两个商业库,分别称为 VendorLibA 和 VendorLibB。这些库根据编译器版本(例如 VC7、VC8)分发了很多 DLL。这两个库都依赖于另一个由该供应商生产的库,称为 VendorLibUtils 并包含在一个 DLL 中。

问题:VendorLibA 使用的 VendorLibUtils 版本与 VendorLibB 不同。这两个版本不是二进制兼容的,即使它们是二进制兼容的,使用错误的版本也是一个坏主意。

有什么方法可以在同一进程下使用这两个库吗?

注意:LoadLibrary 无法解决这个问题,因为我的进程不是导入 VendorLibUtils 的进程。

编辑: 忘了提显而易见的事情,我不必为任何商业图书馆提供源代码,而且可能我永远也不会(叹息)。

编辑: 另一种方法是:How to combine GUI applications in Windows

最佳答案

我认为您最有希望的选择是大声向销售相互不兼容产品的供应商投诉。这与 DLL 的理念背道而驰。

您不能只是将 DLL 放在不同的目录中。加载具有给定名称的 DLL 后,所有其他尝试加载另一个具有相同模块名称的 DLL 的尝试将仅使用已加载的 DLL,即使路径不同也是如此。

由此,我们可以得出结论,要加载 VendorLibUtils 的两个拷贝,一个拷贝需要具有不同的名称。您不能只重命名 DLL 文件;您程序中的代码将不知道要查找不同的文件。因此,也许有一种方法可以编辑 VendorLibB 的导入表,使其认为它需要的功能在 VendorLibUtilsB.dll 中,而不仅仅是 VendorLibUtils.dll。恐怕我不知道有任何实用程序可以做到这一点,但我毫不怀疑这是可能的。

关于c++ - 我可以在同一个进程中使用同一个 DLL 的两个不兼容版本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/315285/

相关文章:

c++ - 从函数 c++ 返回一个列表<int>

c++ - 调用派生类型的模板化函数

c++ - 即使已经包含了类的标题,也被迫使用前向声明

c++ - Visual Studio 2008 中的 cl.exe 包装器

windows - 如何在构建 boost 后列出失败的目标?

c# - USB HID col参数是什么

c++ - 在 Windows 视频支持下使用 PJSIP

c# - 2 应用Top Most问题

c++ - 如何打印调试 C++ Win32 DLL?

windows - 如何在rasdial中保存密码?