プラットフォーム SDK
GetProcAddress
ダイナミックリンクライブラリ(DLL)が持つ、指定されたエクスポート済み関数のアドレスを取得します。
FARPROC GetProcAddress(
HMODULE hModule, // DLL モジュールのハンドル
LPCSTR lpProcName // 関数名
);
パラメータ
- hModule
- [入力]希望の関数を保持する DLL モジュールのハンドルを指定します。LoadLibrary 関数または GetModuleHandle 関数が、このハンドルを返します。
- lpProcName
- [入力]関数名を保持する null で終わる文字列へのポインタを指定します。代わりに、下位ワードに関数の順序値を、上位ワードに 0 を入れた値を指定することもできます。
戻り値
関数が成功すると、DLL のエクスポート済み関数のアドレスが返ります。
関数が失敗すると、NULL が返ります。拡張エラー情報を取得するには、 関数を使います。
解説
GetProcAddress 関数を使って、DLL 内のエクスポート済み関数のアドレスを取得します。
lpProcName が指す関数名のつづり( 大文字と小文字を区別します)は、DLL の作成に使ったモジュール定義ファイル(.DEF ファイル)の EXPORTS ステートメントで記述した名前と同じでなければなりません。Win32 API 関数のエクスポート名は、コード内でそれらの関数を呼び出すときに使う名前とは異なっている可能性があります。SDK のヘッダーファイル内で使われるマクロが原因で、この違いが明確になっていないことがあります。詳細については、「Win32 Function Prototypes」を参照してください。
lpProcName パラメータに、DLL のモジュール定義ファイルの EXPORTS ステートメント内で記述された、1 から始まる順序数を指定して、DLL 関数を識別することもできます。その場合、GetProcAddress 関数は、指定された順序数が、1 から .DEF ファイルでエクスポートされている最大の順序数の範囲に存在するかどうかを確認します。次いで、GetProcAddress は順序数をインデックスとして使って、関数テーブルから関数のアドレスを読み取ります。EXPORTS ステートメントで割り当てた順序数が 1~N(N はエクスポート済みの関数の数)の連続範囲になく、不連続だった場合、lpProcName パラメータで指定された順序数に対応する関数が存在しないと、GetProcAddress が null 以外の無効なアドレスを返し、エラーが発生する可能性があります。
存在しない可能性がある関数を指定するときは、順序数ではなく名前を指定するべきです。
対応情報
Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダーファイル:Winbase.h 内で宣言、Windows.h をインクルード
インポートライブラリ:Kernel32.lib を使用
参照
FreeLibrary, GetModuleHandle, LoadLibrary