GetModuleHandleExA 関数 (libloaderapi.h)
指定したモジュールのモジュール ハンドルを取得し、GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNTが指定されていない限り、モジュールの参照カウントをインクリメントします。 モジュールは、呼び出し元プロセスによって読み込まれている必要があります。
構文
BOOL GetModuleHandleExA(
[in] DWORD dwFlags,
[in, optional] LPCSTR lpModuleName,
[out] HMODULE *phModule
);
パラメーター
[in] dwFlags
このパラメーターには、0 個または 1 つ以上の次の値を指定できます。 モジュールの参照カウントがインクリメントされた場合、呼び出し元は FreeLibrary 関数を使用して、モジュール ハンドルが不要になったときに参照カウントをデクリメントする必要があります。
GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS (0x00000004)
lpModuleName パラメーターは、モジュール内のアドレスです。
GET_MODULE_HANDLE_EX_FLAG_PIN (0x00000001)
FreeLibrary が何回呼び出されても、プロセスが終了するまでモジュールは読み込まれたままです。
このオプションは、GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNTでは使用できません。
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT (0x00000002)
モジュールの参照カウントはインクリメントされません。 このオプションは、 GetModuleHandle の動作と同じです。 取得したモジュール ハンドルを FreeLibrary 関数に渡さないでください。そうすると、DLL が途中でマップ解除される可能性があります。 詳細については、「解説」を参照してください。
このオプションは、GET_MODULE_HANDLE_EX_FLAG_PINでは使用できません。
[in, optional] lpModuleName
読み込まれたモジュールの名前 (.dll または .exe ファイル)、またはモジュール内のアドレス ( dwFlags がGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESSされている場合)。
モジュール名の場合、ファイル名拡張子を省略すると、既定のライブラリ拡張機能 .dll が追加されます。 ファイル名の文字列には、モジュール名に拡張子がないことを示す末尾のポイント文字 (.) を含めることができます。 文字列はパスを指定する必要はありません。 パスを指定するときは、スラッシュ (/) ではなく円記号 (\) を使用してください。 名前は、呼び出し元プロセスのアドレス空間に現在マップされているモジュールの名前と (大文字と小文字は別に) 比較されます。
このパラメーターが NULL の場合、関数は呼び出し元のプロセス (.exe ファイル) の作成に使用されるファイルへのハンドルを返します。
[out] phModule
指定したモジュールへのハンドル。 関数が失敗した場合、このパラメーターは NULL です。
GetModuleHandleEx 関数は、LOAD_LIBRARY_AS_DATAFILE フラグを使用して読み込まれたモジュールのハンドルを取得しません。 詳細については、「 LoadLibraryEx」を参照してください。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 拡張エラー情報を取得するには、「 GetLastError」を参照してください。
解説
返されるハンドルは、グローバルまたは継承可能ではありません。 複製したり、別のプロセスで使用したりすることはできません。
lpModuleName にパスが含まれず、同じベース名と拡張子を持つ複数の読み込まれたモジュールがある場合、返されるモジュール ハンドルを予測できません。 この問題を回避するには、パスを指定するか、 サイド バイ サイド アセンブリを使用するか、 lpModuleName パラメーターに DLL 名ではなくメモリの場所を指定します。
dwFlags にGET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNTが含まれている場合、GetModuleHandleEx 関数は、参照カウントをインクリメントせずに、マップされたモジュールにハンドルを返します。 ただし、このハンドルが FreeLibrary 関数に渡されると、マップされたモジュールの参照カウントがデクリメントされます。 そのため、 GetModuleHandleEx によって返されるハンドルを、GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNTを使用して FreeLibrary 関数に渡さないでください。 これを行うと、DLL モジュールが途中でマップ解除される可能性があります。
dwFlags にGET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNTが含まれている場合は、マルチスレッド アプリケーションでこの関数を慎重に使用する必要があります。 この関数がハンドルを返してから使用される時間までの間、モジュール ハンドルが有効なままであるという保証はありません。 たとえば、スレッドはモジュール ハンドルを取得しますが、ハンドルを使用する前に、2 番目のスレッドによってモジュールが解放されます。 システムが別のモジュールを読み込む場合は、最近解放されたモジュール ハンドルを再利用できます。 したがって、最初のスレッドには、意図したモジュールとは異なるモジュールへのハンドルが含まれます。
この関数を使用するアプリケーションをコンパイルするには、_WIN32_WINNTを 0x0501 以降として定義します。 詳細については、「 Windows ヘッダーの使用」を参照してください。
Note
libloaderapi.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして GetModuleHandleEx を定義します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイルまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。
要件
サポートされている最小のクライアント | Windows XP (デスクトップ アプリのみ) |
サポートされている最小のサーバー | Windows Server 2003 (デスクトップ アプリのみ) |
対象プラットフォーム | Windows |
ヘッダー | libloaderapi.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |