动态链接库搜索顺序
Windows XP启动后,动态链接库的搜索顺序由注册表的HKLM/System/CurrentControlSet/Control/Session Manager/SafeDllSearchMode
值指定。
Windows Server 2003: 默认值为1.
Windows XP: 默认值为 0.
如果 SafeDllSearchMode 值是1, 搜索顺序如下所示:
- 程序载入的目录.
- system目录. 使用GetSystemDirectory 函数获取这个目录路径.
- 16-bit system目录. 没有函数获取这个目录,但属于DLL搜索范围.
- Windows目录. 使用GetWindowsDirectory函数可以获取该目录路径.
- 当前目录.
- PATH 环境变量设置的目录列表.
如果 SafeDllSearchMode 值是0, 搜索顺序如下所示:
- 程序载入的目录.
- 当前目录.
- system目录. 使用GetSystemDirectory 函数获取这个目录路径.
- 16-bit system目录. 没有函数获取这个目录,但属于DLL搜索范围.
- Windows目录. 使用GetWindowsDirectory函数可以获取该目录路径.
- PATH 环境变量设置的目录列表.
替换搜索顺序
LoadLibraryEx 函数支持另一种搜索顺序,当该函数使用参数 LOAD_WITH_ALTERED_SEARCH_PATH ,并且lpFileName参数指定一个路径.
如果 SafeDllSearchMode 值是 1, 搜索顺序如下:
- lpFileName指定的路径.
- system目录. 使用GetSystemDirectory 函数获取这个目录路径.
- 16-bit system目录. 没有函数获取这个目录,但属于DLL搜索范围.
- Windows目录. 使用GetWindowsDirectory函数可以获取该目录路径.
- 当前目录.
- PATH 环境变量设置的目录列表.
如果 SafeDllSearchMode 值是 0, 搜索顺序如下:
- lpFileName指定的路径.
- 当前目录.
- system目录. 使用GetSystemDirectory 函数获取这个目录路径.
- 16-bit system目录. 没有函数获取这个目录,但属于DLL搜索范围.
- Windows目录. 使用GetWindowsDirectory函数可以获取该目录路径.
- PATH 环境变量设置的目录列表.
标准搜索策略与替换搜索策略有一点不同: 标准搜索从程序所在目录开始搜索, 替换搜索则从LoadLibraryEx 指定目录开始。如果你指定用替换搜索策略, 程序继续往下走直到所有相关可执行modules都被定位. 系统开始执行DLL初始化后,系统又切换回标准搜索策略.
传统搜索顺序
老版本的Windows 不支持SafeDllSearchMode 值. DLL搜索顺序如下:
Windows 2000/NT: 系统搜索顺序如下:
- 程序载入的目录.
- 当前目录.
- system目录. 使用GetSystemDirectory 函数获取这个目录路径.
- 16-bit system目录. 没有函数获取这个目录,但属于DLL搜索范围.
- Windows目录. 使用GetWindowsDirectory函数可以获取该目录路径.
- PATH 环境变量设置的目录列表.
Windows Me/98/95: 系统DLL搜索顺序如下:
- 程序载入的目录.
- 当前目录.
- system目录. 使用GetSystemDirectory 函数获取这个目录路径.
- Windows目录. 使用GetWindowsDirectory函数可以获取该目录路径.
- PATH 环境变量设置的目录列表.