更改Windows DLL加载顺序? (加载顺序,而不是搜索顺序)

问题描述 投票:15回答:4

说我有一个可执行文件: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将最后加载。卸载将以相反的顺序进行。

尚未

发现的是

如何影响此加载顺序

...((注))
[a]:这当然意味着将首先加载kernel32.dll,因为msvcr80d.dll将取决于kernel32.dll。

根据某些请求,我为此添加一个理由:


(但是

,我通常对此[感兴趣。我知道如何解决MFC问题。 。
其调试版本中的Microsoft MFC DLL内置了内存泄漏检测。(据我所知,它与_CrtSetDbgFlag和相关工具使用的机制相同。)MFC调试DLL将在卸载时转储所有未释放的内存。现在,如果您的进程中有第二个DLL,它独立于MFC,并且该第二个DLL释放了DLL_PROCESS_DETACH上的内存,则如果MFC DLL在另一个DLL之前被卸载,则MFC报告机制将报告错误的内存泄漏。如果可以确保在所有独立DLL中首先加载调试MFC DLL,然后最后卸载所有其他DLL,则所有其他DLL自身已经被清理干净,而MFC不会报告错误的泄漏。

说我有一个可执行文件:app.exe,我在此可执行文件中使用2个不同的第三方DLL:foo.dll bar.dll,并且应用程序必须隐式链接到这些DLL,也就是说,我不能使用:: LoadLibrary来...

c++ windows dll loader
4个回答
6
投票

4
投票
如果这是一个选项,那么(假设您可以等待很长时间,即在main()之前不访问foo / bar dll函数),则可以在main()中访问一个函数(只需获取一个函数ptr或东西)首先在foo.dll中加载,并绑定所有“静态”链接的函数?

((也许LoadLibrary()触发需要链接的过程相同。不确定。虽然在您的代码中看起来更干净。)


4
投票
您可能可以使用预加载DLL的注册表设置,但我不会这样做,您不希望foo.dll被加载到不需要它的其他进程中。

1
投票
© www.soinside.com 2019 - 2024. All rights reserved.