当前目录与加载应用程序的目录

问题描述 投票:0回答:1

在 Microsoft 文档中,dll 加载顺序在以下链接下定义

https://learn.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order

如果禁用SafeDllSearchMode,搜索顺序如下:

  1. 应用程序加载的目录。
  2. 当前目录。
  3. 系统目录。使用 GetSystemDirectory 函数获取此目录的路径。
  4. 16 位系统目录。没有获取这个目录路径的函数,但是搜索到了
  5. Windows 目录。使用 GetWindowsDirectory 函数获取此目录的路径。
  6. PATH 环境变量中列出的目录。请注意,这不包括应用程序路径注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 App Paths 键。

我不明白两者之间的区别

  1. 应用程序加载的目录
  2. 当前目录

假设应用程序安装在 %programfiles% 中,我在桌面上有一个启动它的快捷方式。 在那种情况下,什么是“加载应用程序的目录”? 当前目录一定是桌面吧?

非常感谢任何澄清。

windows dll
1个回答
0
投票

评论基本上回答了你的问题,但我直接回答,然后提供例子。

  1. “加载应用程序的目录”是包含应用程序 .exe 的目录。

  2. 正如@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”。

© www.soinside.com 2019 - 2024. All rights reserved.