GetProcAddress 関数 (libloaderapi.h)
エクスポートされた関数 (プロシージャとも呼ばれます) または変数のアドレスを、指定されたダイナミック リンク ライブラリ (DLL) から取得します。
構文
FARPROC GetProcAddress(
[in] HMODULE hModule,
[in] LPCSTR lpProcName
);
パラメーター
[in] hModule
関数または変数を含む DLL モジュールへのハンドル。 LoadLibrary、LoadLibraryEx、LoadPackagedLibrary、または GetModuleHandle 関数は、このハンドルを返します。
GetProcAddress 関数は、LOAD_LIBRARY_AS_DATAFILE フラグを使用して読み込まれたモジュールからアドレスを取得しません。 詳細については、「 LoadLibraryEx」を参照してください。
[in] lpProcName
関数または変数名、または関数の序数値。 このパラメーターが序数の値の場合は、下位の単語に含まれている必要があります。上位ワードは 0 である必要があります。
戻り値
関数が成功した場合、戻り値はエクスポートされた関数または変数のアドレスです。
関数が失敗した場合は、返される値は NULL です。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
lpProcName が指す関数名のスペルと大文字と小文字は、ソース DLL のモジュール定義 (.def) ファイルの EXPORTS ステートメントと同じである必要があります。 エクスポートされた関数の名前は、コードでこれらの関数を呼び出すときに使用する名前とは異なる場合があります。 この違いは、SDK ヘッダー ファイルで使用されるマクロでは非表示になります。 詳細については、「 関数プロトタイプの規則」を参照してください。
lpProcName パラメーターは、EXPORTS ステートメントで関数に関連付けられている序数値を指定することで、DLL 関数を識別できます。 GetProcAddress は、指定された序数が、.def ファイルにエクスポートされた最大序数の値を通じて 1 の範囲にあることを確認します。 次に、関数は序数をインデックスとして使用して、関数テーブルから関数のアドレスを読み取ります。
.def ファイルで関数の番号が 1 から N に連続しない場合 ( N はエクスポートされた関数の数です)、指定された序数を持つ関数がない場合でも、 GetProcAddress が無効な NULL 以外のアドレスを返す場合にエラーが発生する可能性があります。
関数が DLL モジュールに存在しない場合 (たとえば、関数が Windows Vista でのみ使用できるが、アプリケーションが Windows XP で実行されている可能性がある場合)、序数ではなく名前で関数を指定し、次のコード フラグメントに示すように、関数が使用できない場合に対応するようにアプリケーションを設計します。
typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.
PGNSI pGNSI;
SYSTEM_INFO si;
ZeroMemory(&si, sizeof(SYSTEM_INFO));
pGNSI = (PGNSI) GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")),
"GetNativeSystemInfo");
if(NULL != pGNSI)
{
pGNSI(&si);
}
else
{
GetSystemInfo(&si);
}
このコード フラグメントを含む完全な例については、「 システム バージョンの取得」を参照してください。
例
例については、「 Run-Time 動的リンクの使用」を参照してください。
要件
サポートされている最小のクライアント | Windows XP [デスクトップ アプリ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | libloaderapi.h (Windows.h を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |