GetModuleHandleW 関数 (libloaderapi.h)

指定したモジュールのモジュール ハンドルを取得します。 モジュールは、呼び出し元プロセスによって読み込まれている必要があります。

「解説」セクションで説明されている競合状態を回避するには、 GetModuleHandleEx 関数を使用します。

構文

HMODULE GetModuleHandleW(
  [in, optional] LPCWSTR lpModuleName
);

パラメーター

[in, optional] lpModuleName

読み込まれたモジュールの名前 (.dll または .exe ファイル)。 ファイル名拡張子を省略すると、既定のライブラリ拡張子 .dll が追加されます。 ファイル名の文字列には、モジュール名に拡張子がないことを示す末尾のポイント文字 (.) を含めることができます。 文字列はパスを指定する必要はありません。 パスを指定するときは、スラッシュ (/) ではなく円記号 (\) を使用してください。 名前は、呼び出し元プロセスのアドレス空間に現在マップされているモジュールの名前と (大文字と小文字は別に) 比較されます。

このパラメーターが NULL の場合、 GetModuleHandle は呼び出し元のプロセス (.exe ファイル) の作成に使用されるファイルへのハンドルを返します。

GetModuleHandle 関数は、LOAD_LIBRARY_AS_DATAFILE フラグを使用して読み込まれたモジュールのハンドルを取得しません。 詳細については、「 LoadLibraryEx」を参照してください。

戻り値

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

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

解説

返されるハンドルはグローバルまたは継承可能ではありません。 複製したり、別のプロセスで使用したりすることはできません。

lpModuleName にパスが含まれず、同じベース名と拡張子を持つ複数の読み込まれたモジュールがある場合、返されるモジュール ハンドルを予測できません。 この問題を回避するには、パスを指定するか、 サイド バイ サイド アセンブリを使用するか、 GetModuleHandleEx を 使用して DLL 名ではなくメモリの場所を指定します。

GetModuleHandle 関数は、参照カウントをインクリメントせずに、マップされたモジュールにハンドルを返します。 ただし、このハンドルが FreeLibrary 関数に渡されると、マップされたモジュールの参照カウントがデクリメントされます。 そのため、 GetModuleHandle によって返されるハンドルを FreeLibrary 関数に渡さないでください。 これを行うと、DLL モジュールが途中でマップ解除される可能性があります。

この関数は、マルチスレッド アプリケーションで慎重に使用する必要があります。 この関数がハンドルを返してから使用される時間までの間、モジュール ハンドルが有効なままであるという保証はありません。 たとえば、スレッドがモジュール ハンドルを取得し、ハンドルを使用する前に、2 番目のスレッドがモジュールを解放するとします。 システムが別のモジュールを読み込む場合は、最近解放されたモジュール ハンドルを再利用できます。 したがって、最初のスレッドは、意図したモジュールとは異なるモジュールへのハンドルを持つことになります。

例については、「ブラシの 使用」を参照してください。

Note

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

要件

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

関連項目

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

FreeLibrary

GetModuleFileName

GetModuleHandleEx

LoadLibrary

LoadLibraryEx