QueryOptionalDelayLoadedAPI 函数 (libloaderapi2.h)
确定延迟加载 DLL 中的指定函数在系统上是否可用。
语法
BOOL QueryOptionalDelayLoadedAPI(
[in] HMODULE hParentModule,
[in] LPCSTR lpDllName,
[in] LPCSTR lpProcName,
DWORD Reserved
);
参数
[in] hParentModule
调用模块的句柄。 桌面应用程序可以使用 GetModuleHandle 或 GetModuleHandleEx 函数获取此句柄。 Windows 应用商店应用应将此参数设置为 static_cast<HMODULE>(&__ImageBase)
。
[in] lpDllName
导出指定函数的延迟加载 DLL 的文件名。 此参数区分大小写。
Windows 应用商店应用应指定 API 集,而不是整体式 DLL。 例如,api-ms-win-core-memory-l1-1-1.dll,而不是 kernel32.dll。
[in] lpProcName
要查询的函数的名称。 此参数区分大小写。
Reserved
此参数是保留的,并且必须为零 (0) 。
返回值
如果指定的函数在系统上可用,则为 TRUE。 如果指定的函数在系统上不可用,则此函数返回 FALSE。 要获得更多的错误信息,请调用 GetLastError。
注解
延迟加载的 DLL 以静态方式链接,但在运行的应用程序引用该 DLL 导出的符号之前,实际不会加载到内存中。 应用程序通常会延迟加载包含应用程序可能很少调用或根本不调用的函数的 DLL,因为 DLL 仅在需要时才加载,而不是像其他静态链接 DLL 一样在应用程序启动时加载。 这有助于提高应用程序性能,尤其是在初始化期间。 延迟加载 DLL 是在链接时使用 /DELAYLOAD (延迟加载导入) 链接器选项指定的。
面向多个 Windows 版本或多个 Windows 设备系列的应用程序还依赖于延迟加载的 DLL,以便在可用时提供可见的额外功能。
桌面应用程序可以使用延迟加载作为运行时动态链接的替代方法,该链接使用 LoadLibrary 或 LoadLibraryEx 加载 DLL, 并使用 GetProcAddress 获取指向函数的指针。 Windows 应用商店应用不能使用 LoadLibrary 或 LoadLibraryEx,因此,若要获得运行时动态链接的好处,Windows 应用商店应用必须使用延迟加载机制。
为了检查延迟加载 DLL 中的函数在系统上是否可用,应用程序使用指定的函数调用 QueryOptionalDelayLoadedAPI。 如果 QueryOptionalDelayLoadedAPI 成功,则应用程序可以安全地调用指定的函数。
示例
以下示例演示如何使用 QueryOptionalDelayLoadedAPI 来确定 MkParseDisplayName 函数在系统上是否可用。
#include <windows.h>
#include <libloaderapi2.h>
// For this example, you need to pass
// /delayload: ext-ms-win-com-ole32-l1-1-1.dll to link.exe.
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
BOOL
AreMonikersSupported ()
{
BOOL isApiAvailable;
// Check if MkParseDisplayName is available on the system. It is only
// available on desktop computers, and not on mobile devices or Xbox.
isApiAvailable =
QueryOptionalDelayLoadedAPI(static_cast<HMODULE>(&__ImageBase),
"ext-ms-win-com-ole32-l1-1-1.dll",
"MkParseDisplayName",
0);
return isApiAvailable;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 10 [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows Server 2016 [桌面应用 |UWP 应用] |
目标平台 | Windows |
标头 | libloaderapi2.h |
Library | WindowsApp.lib |
DLL | Api-ms-win-core-libraryloader-l1-1-1.dll |