Поделиться через


Функция 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
Header libloaderapi2.h
Библиотека WindowsApp.lib
DLL Api-ms-win-core-libraryloader-l1-1-1.dll

См. также раздел

LoadPackagedLibrary

Динамическое связывание во время выполнения