Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Определение присутствия функции в DLL

Delphi , Файловая система , DLL и PlugIns

Определение присутствия функции в DLL

Данная функция определяет присутствие нужной функции в библиотеке (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 then
  begin
    VPointer := GetProcAddress(Vlib, PChar(VFunctionname));
    if VPointer <> nil then
      Result := true;
  end;
end;

Here's the translation of the text into Russian:

Функция Delphi под именем FuncAvail, которая проверяет, есть ли в динамической библиотеке (DLL) определенная функция.

Сигнатура функции

Функция принимает три параметра:

  • VLibraryname: строка, представляющая имя DLL, которую нужно проверить.
  • VFunctionname: строка, представляющая имя функции, которую нужно найти.
  • VPointer: переменная-указатель, которая будет содержать адрес функции, если она найдена, или nil в противном случае.

Возвращаемое значение

Функция возвращает логическое значение, указывающее, была ли функция найдена в DLL (true) или нет (false).

Имплементация

Здесь описывается шаг за шагом, что делает код:

  1. Инициализируем Result в false, что означает, что функция не найдена изначально.
  2. Устанавливаем VPointer в nil.
  3. Загружаем DLL, указанную в VLibraryname, с помощью функции LoadLibrary. Если загрузка fails (то есть возвращает 0), выходим сразу.
  4. Получаем handle к загруженной DLL с помощью функции GetModuleHandle. Храним его в Vlib.
  5. Если Vlib не равно 0, пытаемся получить указатель на функцию, указанную в VFunctionname, внутри DLL с помощью функции GetProcAddress. Это устанавливает VPointer в адрес функции, если она найдена.
  6. Если 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 12:23:18/0.013345956802368/1