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


Функция GetProcAddress

Обрабатывает явное связывание с вызовом DLL GetProcAddress для получения адреса экспортированной функции в DLL. Для вызова функции DLL используется указатель возвращаемой функции. GetProcAddress принимает в качестве параметров обработчик DLL-модуля (возвращаемый LoadLibrary, AfxLoadLibrary или GetModuleHandle) и принимает либо имя функции, которую требуется вызвать, либо порядковый номер экспорта функции.

Так как вы вызываете функцию DLL с помощью указателя и не выполняете проверку типов во время компиляции, убедитесь, что параметры функции верны, чтобы не превышать объем выделенной в стеке памяти и не нарушать права доступа. Одним из способов обеспечения типобезопасности является просмотр прототипов экспортированных функций и создание соответствующих определений типов для указателей функций. Например:

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;

hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "DLLFunc1");
   if (!lpfnDllFunc1)
   {
      // handle the error
      FreeLibrary(hDLL);
      return SOME_ERROR_CODE;
   }
   else
   {
      // call the function
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
   }
}

Указание требуемой функции при вызове GetProcAddress зависит от способа создания библиотеки DLL.

Порядковый номер экспорта можно получить только в том случае, если библиотека DLL, с которой выполняется связывание, создана с помощью файла определения модуля (DEF), и если порядковые номера указаны с помощью функций в разделе EXPORTS DEF-файла библиотеки DLL. Вызов GetProcAddress с порядковым номером экспорта, в отличие от имени функции, выполняется несколько быстрее, если в библиотеке DLL содержится много экспортированных функций, поскольку порядковые номера экспорта служат в качестве индексов в таблице экспорта DLL. При использовании порядкового номера экспорта GetProcAddress может определять функцию напрямую, а не сравнивать указанное имя с именами функций в таблице экспорта библиотеки DLL. Однако вызывать GetProcAddress с порядковым номером экспорта следует, только если вы контролируете присвоение порядковых номеров экспортируемым функциям в DEF-файле.

Что вы хотите сделать?

Дополнительные сведения

См. также

Создание библиотек DLL на C и C++ в Visual Studio