次の方法で共有


GetModuleHandleA 関数 (libloaderapi.h)

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

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

構文

HMODULE GetModuleHandleA(
  [in, optional] LPCSTR 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 番目のスレッドがモジュールを解放するとします。 システムが別のモジュールを読み込む場合は、最近解放されたモジュール ハンドルを再利用できます。 したがって、最初のスレッドは、意図したモジュールとは異なるモジュールへのハンドルを持つことになります。

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

手記

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

必要条件

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

関連項目

Dynamic-Link ライブラリ関数の

FreeLibrary

GetModuleFileName の

GetModuleHandleEx の

LoadLibrary

LoadLibraryEx