次の方法で共有


LoadLibraryW 関数 (libloaderapi.h)

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

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

構文

HMODULE LoadLibraryW(
  [in] LPCWSTR lpLibFileName
);

パラメーター

[in] lpLibFileName

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

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

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

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

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

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

戻り値

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

関数が失敗した場合は、返される値は NULL です。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

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

LoadLibrary を使用すると、ライブラリ モジュールをプロセスのアドレス空間に読み込み、 GetProcAddress で DLL 関数のアドレスを取得するために使用できるハンドルを返すことができます。 LoadLibrary を使用して、他の実行可能モジュールを読み込むこともできます。 たとえば、 関数は、 FindResource または LoadResource で使用できるハンドルを取得する .exe ファイルを指定できます。 ただし、 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 の検索順序の詳細については、「 ダイナミック リンク ライブラリの検索順序」を参照してください。

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

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

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

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

Windows Server 2003 および Windows XP: Visual C++ コンパイラでは、スレッド ローカル変数 (_declspec(thread)) を宣言できる構文がサポートされています。 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 ヘッダーは、LoadLibrary をエイリアスとして定義し、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択します。 エンコードに依存しないエイリアスをエンコードニュートラルでないコードと組み合わせて使用すると、コンパイルまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
対象プラットフォーム Windows
ヘッダー libloaderapi.h (Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

DllMain

ダイナミック リンク ライブラリ関数

Findresource

FreeLibrary

GetProcAddress

GetSystemDirectory

GetWindowsDirectory

LoadLibraryEx

LoadResource

実行時の動的リンク

SetDllDirectory

SetErrorMode