在 Microsoft 文档中,dll 加载顺序在以下链接下定义
https://learn.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order
如果禁用SafeDllSearchMode,搜索顺序如下:
我不明白两者之间的区别
假设应用程序安装在 %programfiles% 中,我在桌面上有一个启动它的快捷方式。 在那种情况下,什么是“加载应用程序的目录”? 当前目录一定是桌面吧?
非常感谢任何澄清。
评论基本上回答了你的问题,但我直接回答,然后提供例子。
“加载应用程序的目录”是包含应用程序 .exe 的目录。
正如@ErykSun 提到的,“当前目录”是进程工作目录。对于加载时 DLL 搜索顺序,这是进程启动的目录。对于运行时 DLL 搜索顺序(例如,在调用
LoadLibrary
时),进程可能已经更改了自己的工作目录,这将是“当前目录”。
例如假设我在命令提示符下,我更改目录,调用
cd C:\Users\Me
。从那里我打电话给"C:\Program Files\Notepad++\Notepad++.exe"
。现在,当前目录是“C:\Users\Me”,加载应用程序的目录是“C:\Program Files\Notepad++”。
应用程序快捷方式
请注意,应用程序快捷方式具有属性“开始于”,这将是加载时 DLL 搜索顺序中的“当前目录”。因此,虽然应用程序快捷方式可能存在于“C:\Users\Me\Desktop”中,但当应用程序启动时,它不会是当前目录。
顺便说一句,快捷方式通常会将“开始于”属性设置为 .exe 所在的目录,在这种情况下,所讨论的两个目录在加载时是相同的。
服务
这两个目录不同的一个常见示例是服务。在 SYSTEM 帐户下运行的服务通常会从“C:\Windows\System32”文件夹启动进程,而应用程序可执行文件通常驻留在其他文件夹中,例如“C:\Program Files”。