我在这个可执行文件中使用2个不同的第三方DLL:foo.dll bar.dll和应用程序必须隐式地链接到这些DLL,这是我不能使用:: LoadLibrary加载它们.
(注意:这不是我不能调用LoadLibrary,但这些DLL需要静态链接(C DLL与__declspec(dllexport)),所以我调用LoadLibrary不会有任何意义,因为可排除的加载程序已经调用它.)
这两个DLL没有任何依赖关系,也就是说,它们的加载顺序是未定义的,尽可能地告诉(并且应该是无关紧要的). (两者的依赖性基本上只在标准的windows dll(kernel32,msvcrt等)
我现在有这个问题,我想控制这些DLL的加载顺序,这是我希望foo.dll总是加载(DLL_PROCESS_ATTACH)在bar.dll之前.
是否可以告诉Windows DLL加载程序在另一个DLL之前加载一个DLL?
编辑:要检查可执行文件的DLL加载顺序,可以使用DUMPBIN.exe实用程序:(只需启动Visual Studio命令提示符)
编辑:根据this answer/this blog entry,NT Loader确实顺序进入导入部分. (这将导致独立的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报告机制会报告错误的内存泄漏,如果MFC DLL在其他DLL之前被卸载.
如果可以确保调试MFC DLL在最后的所有独立DLL中被首先/卸载,则所有其他DLL将自己清理,MFC将不会报告错误的泄漏.