Функция 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-файле.