次の方法で共有


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 ストア アプリでは、モノリシック DLL ではなく API セットを指定する必要があります。 たとえば、kernel32.dll ではなく、api-ms-win-core-memory-l1-1-1.dll します。

[in] lpProcName

クエリを実行する関数の名前。 このパラメーターでは、大文字と小文字が区別されます。

Reserved

このパラメーターは予約済みであり、0 (0) である必要があります。

戻り値

指定した関数がシステムで使用できる場合は TRUE。 指定した関数がシステムで使用できない場合、この関数は FALSE を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

遅延読み込み DLL は静的にリンクされますが、実行中のアプリケーションがその DLL によってエクスポートされたシンボルを参照するまで、実際にはメモリに読み込まれません。 アプリケーションは、他の静的にリンクされた DLL のようにアプリケーションの起動時に読み込まれるのではなく、必要なときにのみ DLL が読み込まれるため、アプリケーションが呼び出す関数を含む DLL の読み込みを遅延することがよくあります。 これは、特に初期化中にアプリケーションのパフォーマンスを向上させるのに役立ちます。 遅延読み込み DLL は、リンク時に /DELAYLOAD (Delay Load Import) リンカー オプションを使用して指定されます。

複数のバージョンの 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

こちらもご覧ください

LoadPackagedLibrary

実行時の動的リンク