SetDefaultDllDirectories 函数 (libloaderapi.h)

指定要在调用进程加载 DLL 时搜索的默认目录集。 在没有LOAD_LIBRARY_SEARCH标志的情况下调用 LoadLibraryEx 时,将使用此搜索路径。

Syntax

BOOL SetDefaultDllDirectories(
  [in] DWORD DirectoryFlags
);

参数

[in] DirectoryFlags

要搜索的目录。 此参数可以是以下值的任意组合。

价值 Meaning
LOAD_LIBRARY_SEARCH_APPLICATION_DIR
0x00000200
如果使用此值,则会搜索应用程序的安装目录。
LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
0x00001000
此值是 LOAD_LIBRARY_SEARCH_APPLICATION_DIRLOAD_LIBRARY_SEARCH_SYSTEM32LOAD_LIBRARY_SEARCH_USER_DIRS的组合。

此值表示应用程序在其 DLL 搜索路径中应包含的建议最大目录数。

LOAD_LIBRARY_SEARCH_SYSTEM32
0x00000800
如果使用此值,则搜索 %windows%\system32。
LOAD_LIBRARY_SEARCH_USER_DIRS
0x00000400
如果使用此值,则会搜索使用 AddDllDirectorySetDllDirectory 函数显式添加的任何路径。 如果添加了多个目录,则搜索这些目录的顺序未指定。

返回值

如果函数成功,则返回值为非零。

如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError

注解

DLL 搜索路径是在 LoadLibraryLoadLibraryEx 函数调用中未指定完整路径时或指定 DLL 的完整路径但系统必须搜索依赖 DLL 时搜索的目录集。 有关标准 DLL 搜索路径的详细信息,请参阅 Dynamic-Link 库搜索顺序

标准 DLL 搜索路径包含可能容易受到 DLL 预加载攻击的目录。 应用程序可以使用 SetDefaultDllDirectories 函数为进程指定默认的 DLL 搜索路径,以消除最易受攻击的目录并限制搜索的其他目录。 进程 DLL 搜索路径仅适用于调用进程,并保留进程生存期。

如果 DirectoryFlags 参数指定多个标志,则按以下顺序搜索目录:

  • 包含 DLL 的目录(LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)。 此目录仅搜索要加载的 DLL 的依赖项。
  • 应用程序目录(LOAD_LIBRARY_SEARCH_APPLICATION_DIR)。
  • 使用 AddDllDirectory 函数(LOAD_LIBRARY_SEARCH_USER_DIRS)或 SetDllDirectory 函数显式添加到应用程序搜索路径的路径。 如果添加了多个路径,则搜索路径的顺序未指定。
  • 系统目录(LOAD_LIBRARY_SEARCH_SYSTEM32)。
如果 SetDefaultDllDirectories 未指定LOAD_LIBRARY_SEARCH_USER_DIRS,则使用 AddDllDirectory 函数指定的目录仅用于指定LOAD_LIBRARY_SEARCH_USER_DIRS的LoadLibraryEx 函数调用。

无法还原到标准 DLL 搜索路径,也无法从搜索路径中删除使用 SetDefaultDllDirectories 指定的任何目录。 但是,可以通过调用具有一个或多个LOAD_LIBRARY_SEARCH标志的 LoadLibraryEx 来重写进程 DLL 搜索路径,并通过调用 RemoveDllDirectory 删除添加的目录。

Windows 7、Windows Server 2008 R2、Windows Vista 和 Windows Server 2008: 若要在应用程序中调用此函数,请使用 GetProcAddress 函数从 Kernel32.dll检索其地址。 必须在 目标平台上安装KB2533623。

要求

Requirement 价值
最低支持的客户端 Windows 8 [仅限桌面应用],在 Windows 7、Windows Server 2008 R2、Windows Vista 和 Windows Server 2008 上KB2533623
支持的最低服务器 Windows Server 2012 [仅限桌面应用]
目标平台 Windows操作系统
Header libloaderapi.h (包括 Windows.h)
Library kernel32。自由
DLL Kernel32.dll

另请参阅

AddDllDirectory

Dynamic-Link 库搜索顺序

Dynamic-Link 库安全性

LoadLibrary

LoadLibraryEx

RemoveDllDirectory