Вопросы, связанные с вызовами функций из динамических библиотек (DLL) в среде разработки Delphi, часто вызывают затруднения у разработчиков. Одной из таких проблем является неправильная обработка исключений, возникающих при попытке загрузки несуществующей DLL. В данной статье мы рассмотрим, как можно автоматизировать процесс проверки DLL и избежать всплывающих сообщений об ошибках, которые могут быть неприятны для конечного пользователя.
Проблема
Разработчик столкнулся с проблемой, когда при попытке вызвать функцию main() из DLL через процедуру call_dll, указав неверный путь к DLL, возникало всплывающее сообщение об ошибке. Сообщение информировало о том, что указанный файл не является Win32 DLL. Разработчик хочет автоматизировать процесс проверки DLL и, в случае ошибки, предложить пользователю выбрать файл снова, не показывая сообщение об ошибке.
Пример кода
Ниже приведен пример кода, который вызывает функцию из DLL:
procedure call_dll(path: string);
var
lib: HMODULE;
mainfn: procedure; stdcall;
begin
if FileExists(path) then
begin
try
lib := LoadLibrary(PAnsiChar(path));
Win32Check(lib <> 0);
try
@mainfn := GetProcAddress(lib, 'main');
Win32Check(Assigned(mainfn));
mainfn();
finally
FreeLibrary(lib);
end;
except
end;
end;
end;
Решение проблемы
Проблема заключается в том, что в коде используется механизм Win32Check, который приводит к генерации исключения в случае ошибки. Для решения задачи необходимо убрать использование Win32Check и обработать возвращаемые значения функций LoadLibrary и GetProcAddress вручную, без использования исключений.
procedure call_dll(path: string);
var
lib: HMODULE;
mainfn: procedure; stdcall;
begin
if FileExists(path) then
begin
lib := LoadLibrary(PAnsiChar(path));
if lib = 0 then
begin
// Обработка ошибки загрузки DLL
// Например, можно предложить пользователю выбрать файл снова
Exit;
end;
try
@mainfn := GetProcAddress(lib, 'main');
if @mainfn = nil then
begin
// Обработка ошибки получения адреса функции
// Например, можно предложить пользователю выбрать файл снова
FreeLibrary(lib);
Exit;
end;
mainfn();
finally
FreeLibrary(lib);
end;
end
else
begin
// Обработка ошибки отсутствия файла по указанному пути
// Например, можно предложить пользователю выбрать файл снова
Exit;
end;
end;
Также, для предотвращения всплывающих системных сообщений об ошибках, рекомендуется использовать функцию SetErrorMode, чтобы отключить их на этапе старта программы:
var
Mode: DWORD;
begin
Mode := SetErrorMode(SEM_FAILCRITICALERRORS);
SetErrorMode(Mode or SEM_FAILCRITICALERRORS);
end;
Этот код следует разместить в точке входа программы, чтобы обеспечить корректное отключение сообщений об ошибках.
Заключение
Автоматизация проверки динамических библиотек в Delphi позволяет избежать неприятных для пользователя сообщений об ошибках и повысить удобство использования программ, написанных на этом языке программирования. Приведенные примеры кода демонстрируют, как можно модифицировать существующий код для достижения желаемого результата.
Автоматизация проверки динамических библиотек в Delphi для решения проблемы с неправильными путями к DLL и исключениями при их загрузке.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS