FreeLibrary 関数 (libloaderapi.h)
読み込まれたダイナミック リンク ライブラリ (DLL) モジュールを解放し、必要に応じて参照カウントをデクリメントします。 参照カウントが 0 に達すると、モジュールは呼び出し元プロセスのアドレス空間からアンロードされ、ハンドルは無効になります。
構文
BOOL FreeLibrary(
[in] HMODULE hLibModule
);
パラメーター
[in] hLibModule
読み込まれたライブラリ モジュールへのハンドル。 LoadLibrary、LoadLibraryEx、
GetModuleHandle 関数または GetModuleHandleEx 関数は、このハンドルを返します。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 エラーの詳細情報を得るには、GetLastError 関数を呼び出します。
解説
システムは、読み込まれた各モジュールのプロセスごとの参照カウントを保持します。 読み込み時の動的リンクが原因でプロセスの初期化時に読み込まれたモジュールの参照カウントは 1 です。 モジュールの参照カウントは、 LoadLibrary の呼び出しによってモジュールが読み込まれるたびにインクリメントされます。 モジュールが初めて読み込まれ、データまたはイメージ ファイルとして読み込まれる場合を除き、 LoadLibraryEx の呼び出しによっても参照カウントが増加します。
モジュールに対して FreeLibrary 関数または FreeLibraryAndExitThread 関数が呼び出されるたびに、参照カウントがデクリメントされます。 モジュールの参照カウントが 0 に達するか、プロセスが終了すると、システムはプロセスのアドレス空間からモジュールをアンロードします。 ライブラリ モジュールをアンロードする前に、モジュールに DLL_PROCESS_DETACH 値がある場合は、モジュールの DllMain 関数を呼び出すことで、モジュールをプロセスからデタッチできます。 これにより、ライブラリ モジュールは、現在のプロセスに代わって割り当てられたリソースをクリーンできます。 エントリ ポイント関数が戻った後、ライブラリ モジュールは現在のプロセスのアドレス空間から削除されます。
DllMain から FreeLibrary を呼び出しても安全ではありません。 詳細については、 DllMain の「解説」セクションを参照してください。
FreeLibrary を呼び出しても、同じモジュールを使用している他のプロセスには影響しません。
GetModuleHandle によって返されるハンドルを使用して FreeLibrary を呼び出す場合は注意が必要です。 GetModuleHandle 関数はモジュールの参照カウントをインクリメントしないため、このハンドルを FreeLibrary に渡すと、モジュールが途中でアンロードされる可能性があります。
実行中の DLL をアンロードしてからそれ自体を終了する必要があるスレッドは、FreeLibrary と ExitThread を個別に呼び出すのではなく、FreeLibraryAndExitThread を呼び出す必要があります。 そうしないと、競合状態が発生する可能性があります。 詳細については、 FreeLibraryAndExitThread の「解説」セクションを参照してください。
例
例については、「 Run-Time 動的リンクの使用」を参照してください。
要件
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | libloaderapi.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |