说我有一个可执行文件:app.exe
我在此可执行文件中使用2个不同的第三方DLL:foo.dll
bar.dll
,并且应用程序必须隐式链接到这些DLL,也就是说,我不能使用::LoadLibrary
来加载它们。
((注:这不是我不能调用LoadLibrary
,但是这些DLL需要静态链接(带有__declspec(dllexport)
的C ++ DLL)),所以我调用LoadLibrary
并没有任何意义,因为可执行加载程序已经对其进行了调用。)
这两个DLL彼此之间没有任何依赖关系,也就是说,据我所知,它们的加载顺序是不确定的(并且应该不相关)。 (两者的依赖关系基本上仅在标准Windows dll(kernel32,msvcrt等)上进行。我现在有一个问题,我希望控制这些DLL的加载顺序,也就是我希望在bar.dll之前先加载foo.dll([总是
(DLL_PROCESS_ATTACH
)。是否有可能告诉Windows DLL加载程序先加载一个DLL?
编辑:要检查DLL加载顺序
,可以使用DUMPBIN.exe
实用程序:(只需启动Visual Studio命令提示符)编辑:根据this answer / this blog entry,NT加载程序does
依次遍历导入部分。 (这将导致independent
DLL按照它们在导入部分中出现的顺序被加载。)C:\path\to\program> dumpbin /IMPORTS app.exe | grep -i \.dll
MSVCR80D.dll
KERNEL32.dll
OLEAUT32.dll
MSVCP80D.dll
foo.dll
bar.DLL
此输出意味着MSVCR80D.dll(及其依赖项[a])将首先加载,而bar.DLL将最后加载。卸载将以相反的顺序进行。
我尚未
发现的是如何影响此加载顺序
...((注))根据某些请求,我为此添加一个理由:
请
,我通常对此[说我有一个可执行文件:app.exe,我在此可执行文件中使用2个不同的第三方DLL:foo.dll bar.dll,并且应用程序必须隐式链接到这些DLL,也就是说,我不能使用:: LoadLibrary来...
foo.dll
中加载,并绑定所有“静态”链接的函数?((也许LoadLibrary()触发需要链接的过程相同。不确定。虽然在您的代码中看起来更干净。)
foo.dll
被加载到不需要它的其他进程中。