GetModuleHandleA 関数 (libloaderapi.h)
指定したモジュールのモジュール ハンドルを取得します。 モジュールは、呼び出し元プロセスによって読み込まれている必要があります。
「解説」セクションで説明されている競合状態を回避するには、getModuleHandleEx 関数
構文
HMODULE GetModuleHandleA(
[in, optional] LPCSTR lpModuleName
);
パラメーター
[in, optional] lpModuleName
読み込まれたモジュールの名前 (.dll または .exe ファイル)。 ファイル名拡張子を省略すると、既定のライブラリ拡張機能 .dll が追加されます。 ファイル名の文字列には、モジュール名に拡張子がないことを示す末尾のポイント文字 (.) を含めることができます。 文字列はパスを指定する必要はありません。 パスを指定するときは、スラッシュ (/) ではなく円記号 (\) を使用してください。 名前は、呼び出し元プロセスのアドレス空間に現在マップされているモジュールの名前と (大文字と小文字を区別せず) 比較されます。
このパラメーターが NULL の場合、GetModuleHandle
GetModuleHandle 関数は、LOAD_LIBRARY_AS_DATAFILE フラグを使用して読み込まれたモジュールのハンドルを取得しません。 詳細については、「LoadLibraryEx
戻り値
関数が成功した場合、戻り値は指定されたモジュールへのハンドルです。
関数が失敗した場合、戻り値は NULL です。 拡張エラー情報を取得するには、GetLastError
備考
返されるハンドルはグローバルでも継承可能でありません。 別のプロセスで複製または使用することはできません。
lpModuleName
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 |
関連項目
GetModuleFileName の
GetModuleHandleEx の