在 Windows 操作系统中,当一个应用程序尝试加载一个动态链接库(DLL)而没有指定完整的路径时,系统会按照一定的顺序搜索 DLL 的位置。这个搜索顺序可以通过不同的方式进行调整,但默认情况下,搜索顺序如下:
1. 应用程序所在目录:系统首先会在启动应用程序的同一目录下搜索 DLL。
2. 系统目录:如果应用程序所在目录中没有找到 DLL,系统会查找系统目录下的 DLL。这通常是 C:\Windows\System32 对于 32 位系统,或 C:\Windows\SysWOW64 对于 64 位系统。
3. 16位系统目录:这是一个为了兼容旧的 16 位应用程序而保留的目录,通常不是必需考虑的。
4. Windows 目录:接下来,系统会在 C:\Windows 目录下搜索 DLL。
5. 当前目录:系统会检查当前工作目录,即执行 Getcwd 或 GetCurrentDirectory 函数得到的路径。
6. 环境变量 PATH 中指定的目录:最后,系统会在环境变量 PATH 中列出的所有目录中搜索 DLL。
如果在上述搜索过程中找到了多个同名的 DLL,系统会根据特定的规则选择一个版本来加载。例如,如果启用了“安全的 DLL 搜索模式”(safe DLL search mode),系统会优先选择在应用程序目录或系统目录中的 DLL,而不是在当前目录或 PATH 环境变量中的 DLL。
此外,开发者可以通过一些特殊的方法来改变这个默认的搜索顺序,例如使用 LoadLibraryEx 函数并指定 LOAD_WITH_ALTERED_SEARCH_PATH 标志,或者调用 SetDllDirectory 函数来添加一个额外的搜索路径到列表的开始位置。
需要注意的是,上述信息是基于 Windows 操作系统的一般行为,具体的搜索顺序可能会因操作系统的不同版本或特定的系统配置而有所变化。在处理 DLL 相关的操作时,了解这些搜索规则对于确保应用程序能够正确加载所需的库是非常重要的。