Функция 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
Имя функции или переменной или порядковое значение функции. Если этот параметр является порядковым значением, оно должно быть в слове нижнего порядка; Слово высокого порядка должно быть равно нулю.
Возвращаемое значение
Если функция выполнена успешно, возвращаемым значением будет адрес экспортируемой функции или переменной.
Если функция завершается сбоем, возвращается значение NULL. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.
Комментарии
Написание и регистр имени функции, на которую указывает lpProcName , должны быть идентичными в инструкции EXPORTS файла определения модуля (DEF) исходной БИБЛИОТЕКи DLL. Экспортированные имена функций могут отличаться от имен, используемых при вызове этих функций в коде. Эта разница скрыта макросами, используемыми в файлах заголовков пакета SDK. Дополнительные сведения см. в разделе Соглашения для прототипов функций.
Параметр lpProcName может определить функцию DLL, указав порядковое значение, связанное с функцией в инструкции EXPORTS . GetProcAddress проверяет, находится ли указанный порядковый номер в диапазоне от 1 до максимального порядкового значения, экспортированного в DEF-файле. Затем функция использует порядковый номер в качестве индекса для чтения адреса функции из таблицы функций.
Если 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 |
Header | libloaderapi.h (включая Windows.h) |
Библиотека | Kernel32.lib |
DLL | Kernel32.dll |
См. также
Функции библиотеки динамической компоновки