ksh*_*har 11 c++ windows dll winapi
我正在使用由同一供应商生产的两个商业库,名为VendorLibA和VendorLibB.这些库分布了许多依赖于编译器版本的DLL(例如VC7,VC8).两个库都依赖于另一个库,由该供应商生成,名为VendorLibUtils并包含在一个DLL中.
问题:VendorLibA使用与VendorLibB不同的VendorLibUtils版本.这两个版本不是二进制兼容的,即使它们是使用错误的版本也是一个坏主意.
有什么方法可以在同一个过程中使用这两个库吗?
注意: LoadLibrary无法解决此问题,因为我的进程不是导入VendorLibUtils的进程.
编辑:忘了提到显而易见的,我没有任何商业图书馆的源代码,可能我永远不会(感叹).
编辑:替代btw,是这样做:如何在Windows中组合GUI应用程序
我认为您最有希望的选择是大声抱怨分发互不兼容产品的供应商.这反而违背了DLL的想法.
您不能只将DLL放在不同的目录中.一旦加载了具有给定名称的DLL,所有其他尝试加载具有相同模块名称的另一个DLL将仅使用已加载的DLL,即使路径不同.
由此,我们可以得出结论,要加载两个VendorLibUtils副本,一个副本需要具有不同的名称.你不能只重命名DLL文件; 程序中的代码不知道要查找不同的文件.因此,也许有一种方法可以编辑VendorLibB的导入表,使其认为所需的功能在VendorLibUtilsB.dll而不仅仅是VendorLibUtils.dll中.我担心我不知道会有什么用处,但我毫不怀疑它有可能做到.
我有一个类似的问题。具体来说,我想使用嵌入在使用不兼容 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.dll
将QtCoreX.dll
. 请注意,重命名保持相同的字符数,这很重要。接下来,我打开的文件
QtGui.pyd
在记事本++,并取代所有纯文本引用QtGui4.dll
,以QtGuiX.dll
从QtCore4.dll
到QtCoreX.dll
。我对文件重复了这个过程:QtCore.pyd
,QtGuiX.dll
和QtCoreX.dll
.最后我检查了我的 PyQt 测试应用程序是否仍然有效。它做了!然后我尝试从嵌入式 Python 解释器运行 PyQt 测试应用程序,它也运行良好。
因此,它似乎适用于一些微不足道的情况。我希望我需要对 PyQt 发行版中的所有 DLL 和 PYD 重复该过程。
这可能不是正确的做事方式,但我想不出任何具体的原因它会爆炸(除非我改变了文件名的长度)。
赞扬(或责备)线程上的其他人激发了这个可怕的故事。
由于您没有直接使用 VendorLibUtils,我假设您不能使用LoadLibrary等。
如果 VendorLibUtils DLL 仅按序号导出,您可能可以重命名其中一个库并修补相应的 VendorLib X以对其导入使用不同的文件名。
如果 VendorLibUtils DLL 具有一个或多个同名的导出符号,您可能还需要修补导入和导出表,但我们希望不会!:-)