Поделиться через


Функция 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

См. также

Функции библиотеки динамической компоновки

FreeLibrary

GetModuleHandle

LoadLibrary

LoadLibraryEx

LoadPackagedLibrary

Динамическое связывание во время выполнения

API-интерфейсы Vertdll, доступные в анклавах VBS