Данная функция определяет присутствие нужной функции в библиотеке (dll) и, в случае нахождения искомой функции возвращает True, иначе False.
function FuncAvail (VLibraryname, VFunctionname: string;
var VPointer: pointer): boolean;
var
Vlib: tHandle;
begin
Result := false;
VPointer := nil;
if LoadLibrary(PChar(VLibraryname)) = 0 then
exit;
VPointer := GetModuleHandle(PChar(VLibraryname));
if Vlib <> 0 thenbegin
VPointer := GetProcAddress(Vlib, PChar(VFunctionname));
if VPointer <> nilthen
Result := true;
end;
end;
Here's the translation of the text into Russian:
Функция Delphi под именем FuncAvail, которая проверяет, есть ли в динамической библиотеке (DLL) определенная функция.
Сигнатура функции
Функция принимает три параметра:
VLibraryname: строка, представляющая имя DLL, которую нужно проверить.
VFunctionname: строка, представляющая имя функции, которую нужно найти.
VPointer: переменная-указатель, которая будет содержать адрес функции, если она найдена, или nil в противном случае.
Возвращаемое значение
Функция возвращает логическое значение, указывающее, была ли функция найдена в DLL (true) или нет (false).
Имплементация
Здесь описывается шаг за шагом, что делает код:
Инициализируем Result в false, что означает, что функция не найдена изначально.
Устанавливаем VPointer в nil.
Загружаем DLL, указанную в VLibraryname, с помощью функции LoadLibrary. Если загрузка fails (то есть возвращает 0), выходим сразу.
Получаем handle к загруженной DLL с помощью функции GetModuleHandle. Храним его в Vlib.
Если Vlib не равно 0, пытаемся получить указатель на функцию, указанную в VFunctionname, внутри DLL с помощью функции GetProcAddress. Это устанавливает VPointer в адрес функции, если она найдена.
Если VPointer не равно nil, устанавливаем Result в true.
Альтернативное решение
Хотя этот код работает, есть некоторые минимальные улучшения, которые можно сделать:
Используйте более описательное имя переменной вместо Vlib. Например, DLLHandle.
Рассмотрите использование блока try-except вместо проверки возвращаемого значения функций LoadLibrary и GetProcAddress. Это сделает код более устойчивым к ошибкам.
Если вы интересуетесь только тем, знаете ли функция существует или нет, рассмотрите более простой подход:
function FuncAvail(ВLibraryname: string; VFunctionname: string): boolean;
var
DLLHandle: HMODULE;
begin
Result := false;
DLLHandle := LoadLibrary(PChar(VLibraryname));
if DLLHandle <> 0 then
begin
Result := GetProcAddress(DLLHandle, PChar(VFunctionname)) <> nil;
FreeLibrary(DLLHandle);
end;
end;
Этот код более компактен и avoids неиспользуемых переменных.
Функция FuncAvail determines the presence of a necessary function in a library (DLL) and returns True if it is found, otherwise False.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.