次の方法で共有


LoadLibraryW 関数 (libloaderapi.h)

指定したモジュールを呼び出し元プロセスのアドレス空間に読み込みます。 指定されたモジュールによって、他のモジュールが読み込まれる可能性があります。

追加の読み込みオプションについては、LoadLibraryEx 関数を使用します。

構文

HMODULE LoadLibraryW(
  [in] LPCWSTR lpLibFileName
);

パラメーター

[in] lpLibFileName

モジュールの名前。 これは、ライブラリ モジュール (.dll ファイル) または実行可能モジュール (.exe ファイル) のいずれかです。 指定したモジュールが実行可能モジュールの場合、静的インポートは読み込まれません。代わりに、 フラグを使用して LoadLibraryEx を したかのようにモジュールが読み込まれます。

指定された名前はモジュールのファイル名であり、モジュール定義 (.def) ファイルの LIBRARY キーワードで指定されているように、ライブラリ モジュール自体に格納されている名前には関係ありません。

文字列で完全なパスが指定されている場合、関数はモジュールのそのパスのみを検索します。

文字列が相対パスまたはパスのないモジュール名を指定する場合、関数は標準の検索戦略を使用してモジュールを検索します。詳細については、「解説」を参照してください。

関数がモジュールを見つけられない場合、関数は失敗します。 パスを指定するときは、スラッシュ (/) ではなく円記号 (\) を使用してください。 パスの詳細については、「ファイルまたはディレクトリの名前付け」を参照してください。

文字列でパスのないモジュール名を指定し、ファイル名拡張子を省略すると、既定のライブラリ拡張機能 ".DLL" がモジュール名に追加されます。 関数がモジュール名に ".DLL" を追加しないようにするには、モジュール名の文字列に末尾のポイント文字 (.) を含めます。

戻り値

関数が成功した場合、戻り値はモジュールへのハンドルです。

関数が失敗した場合、戻り値は NULL です。 拡張エラー情報を取得するには、GetLastError呼び出します。

備考

DLL の読み込み中にローダーによって表示されるエラー メッセージを有効または無効にするには、SetErrorMode 関数を使用します。

LoadLibrary を使用すると、ライブラリ モジュールをプロセスのアドレス空間に読み込み、GetProcAddress で使用できるハンドルを返して DLL 関数のアドレスを取得できます。 LoadLibrary を使用して、他の実行可能モジュールを読み込むこともできます。 たとえば、関数は、.exe ファイルを指定して、FindResource または LoadResourceで使用できるハンドルを取得できます。 ただし、LoadLibrary を使用して .exe ファイルを実行しないでください。 代わりに、CreateProcess 関数を使用します。

指定されたモジュールが呼び出し元のプロセス用にまだ読み込まれていない DLL の場合、システムは DLL の DllMain 関数を DLL_PROCESS_ATTACH 値で呼び出します。 DllMain TRUE返す場合、LoadLibrary はモジュールへのハンドルを返 。 dllMain が FALSE返した場合、システムはプロセス アドレス空間から DLL をアンロードし、LoadLibrary NULL返します。 DllMainから LoadLibrary 呼び出しても安全ではありません。 詳細については、「DllMainの「解説」セクションを参照してください。

モジュール ハンドルはグローバルまたは継承できません。 あるプロセス LoadLibrary を呼び出しても、別のプロセスが使用できるハンドルは生成されません。たとえば、GetProcAddressを呼び出す場合などです。 もう 1 つのプロセスでは、GetProcAddressを呼び出す前に、モジュール LoadLibrary 独自の呼び出しを行う必要があります。

lpFileName パスが含まれず、同じベース名と拡張子を持つ複数の読み込まれたモジュールがある場合、関数は最初に読み込まれたモジュールにハンドルを返します。

lpFileName パラメーターにファイル名拡張子が指定されていない場合は、既定のライブラリ拡張 .dll が追加されます。 ただし、ファイル名の文字列には、モジュール名に拡張子がないことを示す末尾のポイント文字 (.) を含めることができます。 パスが指定されていない場合、関数は、読み込まれるモジュールの基本名と一致するベース名を持つ読み込まれたモジュールを検索します。 名前が一致すると、読み込みが成功します。 それ以外の場合、関数はファイルを検索します。

最初に検索されるディレクトリは、呼び出し元プロセスの作成に使用されるイメージ ファイルを含むディレクトリです (詳細については、CreateProcess 関数 を参照してください)。 これにより、プロセスのインストールされているディレクトリを PATH 環境変数に追加せずに、プロセスに関連付けられているプライベート ダイナミック リンク ライブラリ (DLL) ファイルを見つけることができます。 相対パスを指定すると、DLL 検索パス リスト内のすべてのトークンに相対パス全体が追加されます。 他のパスを検索せずに相対パスからモジュールを読み込むには、GetFullPathName 使用して非リレーショナル パスを取得し、非リレーショナル パス LoadLibrary を呼び出します。 DLL 検索順序の詳細については、「Dynamic-Link ライブラリ検索順序」を参照してください。

検索パスは、SetDllDirectory 関数を使用して変更できます。 このソリューションは、SetCurrentDirectory を使用したり、DLL への完全なパスをハードコーディングしたりする代わりに推奨されます。

パスが指定されていて、アプリケーションのリダイレクト ファイルがある場合、関数はアプリケーションのディレクトリ内のモジュールを検索します。 モジュールがアプリケーションのディレクトリに存在する場合、LoadLibrary は指定されたパスを無視し、アプリケーションのディレクトリからモジュールを読み込みます。 モジュールがアプリケーションのディレクトリに存在しない場合は、LoadLibrary 指定したディレクトリからモジュールを読み込みます。 詳細については、「ダイナミック リンク ライブラリ リダイレクト」を参照してください。

パス指定のないアセンブリの名前 LoadLibrary を呼び出し、アセンブリがシステム互換マニフェストに一覧表示されている場合、呼び出しはサイド バイ サイド アセンブリに自動的にリダイレクトされます。

システムは、読み込まれたすべてのモジュールに対してプロセスごとの参照カウントを保持します。 LoadLibrary 呼び出すと、参照カウントがインクリメントされます。 FreeLibrary または FreeLibraryAndExitThread 関数 呼び出すと、参照カウントがデクリメントされます。 システムは、参照カウントが 0 に達したとき、または (参照カウントに関係なく) プロセスが終了したときに、モジュールをアンロードします。

Windows Server 2003 および Windows XP: Visual C++ コンパイラでは、スレッド ローカル変数 (_declspec(スレッド)を宣言できる構文がサポートされています。 DLL でこの構文を使用する場合は、Windows Vista より前のバージョンの Windows LoadLibrary を使用して DLL を明示的に読み込むことができなくなります。 DLL が明示的に読み込まれる場合は、_declspec(スレッド)の代わりにスレッド ローカル ストレージ関数を使用する必要があります。 例については、「ダイナミック リンク ライブラリでのスレッド ローカル ストレージの使用の 」を参照してください。

セキュリティに関する備考

SearchPath 関数を使用して、後続の loadLibrary 呼び出しの DLL へのパス 取得しないでください。 SearchPath 関数は、LoadLibrary とは異なる検索順序を使用します。BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODEで SetSearchPathMode 呼び出して明示的に有効にしない限り、セーフ プロセス検索モードは使用されません。 そのため、SearchPath は、まずユーザーの現在の作業ディレクトリで指定された DLL を検索する可能性があります。 攻撃者が悪意のあるバージョンの DLL を現在の作業ディレクトリにコピーした場合、SearchPath によって取得されたパスが悪意のある DLL を指し示し、LoadLibrary 読み込まれます。

DLL を検索する LoadLibrary 呼び出しに基づいてオペレーティング システムのバージョンを想定しないでください。 DLL が正当に存在しないが、DLL の悪意のあるバージョンが検索パスにある環境でアプリケーションが実行されている場合は、悪意のあるバージョンの DLL が読み込まれる可能性があります。 代わりに、「システム バージョンのの取得 」で説明されている推奨される手法を使用してください。

例については、「Run-Time ダイナミック リンクの使用 」を参照してください。

手記

libloaderapi.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして LoadLibrary を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリのみ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー libloaderapi.h (Windows.h を含む)
ライブラリ Kernel32.lib
DLL Kernel32.dll

関連項目

DllMain

Dynamic-Link ライブラリ関数の

FindResource の

FreeLibrary

GetProcAddress の

GetSystemDirectory の

GetWindowsDirectory の

LoadLibraryEx

LoadResource の

動的リンク の Run-Time

SetDllDirectory

SetErrorMode の