DLL搜索机制
Windows桌面应用程序可以通过多种方法来控制DLL加载路径:
- 通过manifest文件指定。
- DLL重定向技术可以使LoadLibrary 优先在应用程序所在目录查找。
- 如果上面两种方法都没有使用,则会做下面的检查:
- 如果同名的DLL已经在内存里,则会直接使用,不会开启搜索。
- 如果DLL在知名的DLL列表里(在这个注册表下: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs),则会使用这些知名DLL,不会开启搜索。 - 如果以上条件都没有满足,则会开启DLL搜索。
- 另外,对于DLL依赖的其他DLL,比如
a.dll
依赖b.dll
,系统会直接用b.dll
的名字调用LoadLibrary
,而不会加入额外的路径。
DLL标准搜索顺序
DLL标准搜索顺序,分安全搜索模式和非安全搜索模式。默认安全搜索模式是开启的,如果要禁用可以通过创建注册表键值HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager**SafeDllSearchMode**并设为0。本文只讨论安全搜索模式。对于非安全搜索模式,可以参考官方文档。
安全模式搜索顺序:
-
应用程序加载时所在的目录。
-
系统目录。可以使用
GetSystemDirectory
获取。
#include <Windows.h>
#include <iostream>
int main() {
const int MAX_BUFFER_SIZE =