说我有一个可执行文件: app.exe
我在这个可执行文件中使用了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 Loader在另一个之前加载一个DLL?
编辑:要检查可执行文件的DLL加载顺序,可以使用该DUMPBIN.exe实用程序:(只需启动Visual Studio命令提示符)
编辑:根据此答案/此博客条目,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
Run Code Online (Sandbox Code Playgroud)
此输出表示将首先加载MSVCR80D.dll(及其依赖项[a]),最后将加载bar.DLL.卸载将以相反的顺序发生.
我还没有发现的是如何影响这个加载顺序 ......
(笔记)
[a]:这当然意味着首先会加载kernel32.dll,因为msvcr80d.dll将依赖于kernel32.dll.
按一些要求,我加入一个理由是:(但请,我仍然有兴趣在此一般.我知道如何解决该问题的MFC. ) …