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

ksh*_*har 11 c++ windows dll winapi

我正在使用由同一供应商生产的两个商业库,名为VendorLibA和VendorLibB.这些库分布了许多依赖于编译器版本的DLL(例如VC7,VC8).两个库都依赖于另一个库,由该供应商生成,名为VendorLibUtils并包含在一个DLL中.

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

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

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

编辑:忘了提到显而易见的,我没有任何商业图书馆的源代码,可能我永远不会(感叹).

编辑:替代btw,是这样做:如何在Windows中组合GUI应用程序

Rob*_*edy 5

我认为您最有希望的选择是大声抱怨分发互不兼容产品的供应商.这反而违背了DLL的想法.

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

由此,我们可以得出结论,要加载两个VendorLibUtils副本,一个副本需要具有不同的名称.你不能只重命名DLL文件; 程序中的代码不知道要查找不同的文件.因此,也许有一种方法可以编辑VendorLibB的导入表,使其认为所需的功能在VendorLibUtilsB.dll而不仅仅是VendorLibUtils.dll中.我担心我不知道会有什么用处,但我毫不怀疑它有可能做到.


cdi*_*ins 5

我有一个类似的问题。具体来说,我想使用嵌入在使用不兼容 Qt 版本的应用程序中的 Python 解释器中的 PyQt。主应用程序使用了两个 Qt DLL:QtCore.dll 和 QtGui.dll。

当我从嵌入式 Python 解释器加载 PyQt 时,我会收到一个错误:

ImportError: DLL load failed: The specified procedure could not be found.
Run Code Online (Sandbox Code Playgroud)

这发生在线路上:

from PyQt4 import QtGui
Run Code Online (Sandbox Code Playgroud)

问题在于,一旦将不兼容的 QtGui.dll 加载到主应用程序的进程空间,任何对 QtGui.dll 的引用(例如来自文件 QtGui.pyd)都是不正确的。

接下来发生的事情,我并不骄傲。

首先我QtGui4.dll在 PyQt 发行版中QtGuiX.dll 重命名为,然后QtCore4.dllQtCoreX.dll. 请注意,重命名保持相同的字符数,这很重要。

接下来,我打开的文件QtGui.pyd在记事本++,并取代所有纯文本引用QtGui4.dll,以QtGuiX.dllQtCore4.dllQtCoreX.dll。我对文件重复了这个过程: QtCore.pyd,QtGuiX.dllQtCoreX.dll.

最后我检查了我的 PyQt 测试应用程序是否仍然有效。它做了!然后我尝试从嵌入式 Python 解释器运行 PyQt 测试应用程序,它也运行良好。

因此,它似乎适用于一些微不足道的情况。我希望我需要对 PyQt 发行版中的所有 DLL 和 PYD 重复该过程。

这可能不是正确的做事方式,但我想不出任何具体的原因它会爆炸(除非我改变了文件名的长度)。

赞扬(或责备)线程上的其他人激发了这个可怕的故事。


act*_*.se 3

由于您没有直接使用 VendorLibUtils,我假设您不能使用LoadLibrary等。

如果 VendorLibUtils DLL 仅按序号导出,您可能可以重命名其中一个库并修补相应的 VendorLib X以对其导入使用不同的文件名。

如果 VendorLibUtils DLL 具有一个或多个同名的导出符号,您可能还需要修补导入和导出表,但我们希望不会!:-)