При работе с внешними DLL в Delphi или Lazarus иногда возникает ситуация, когда библиотека выводит нежелательные сообщения в стандартный поток вывода (STDOUT). В данной статье рассмотрим решение этой проблемы на примере библиотеки JasPer.
Проблема
При использовании функции jas_image_decode() из DLL JasPer в консольном приложении библиотека выводит предупреждения в STDOUT. Это может мешать нормальной работе приложения, особенно если вывод консоли используется для других целей.
Решение
Согласно документации JasPer и ответам сообщества, проблема решается перенаправлением функции логирования. Вот как это можно реализовать в Delphi/Lazarus:
1. Использование стандартной функции отключения логов
// Объявление необходимых типов и функций
type
Tjas_vlogmsgf = function(typ: Cardinal; const fmt: PAnsiChar; args: Pointer): Integer; cdecl;
var
jas_conf_set_vlogmsgf: procedure(logfunc: Tjas_vlogmsgf); cdecl;
jas_vlogmsgf_discard: Tjas_vlogmsgf;
// Загрузка функций из DLL
procedure LoadJasPerFunctions;
var
LibHandle: THandle;
begin
LibHandle := LoadLibrary('jasper.dll');
if LibHandle = 0 then
raise Exception.Create('Не удалось загрузить библиотеку JasPer');
@jas_conf_set_vlogmsgf := GetProcAddress(LibHandle, 'jas_conf_set_vlogmsgf');
@jas_vlogmsgf_discard := GetProcAddress(LibHandle, 'jas_vlogmsgf_discard');
if not Assigned(jas_conf_set_vlogmsgf) or not Assigned(jas_vlogmsgf_discard) then
raise Exception.Create('Не удалось найти необходимые функции в DLL');
end;
// Установка функции логирования
procedure DisableJasPerLogging;
begin
jas_conf_set_vlogmsgf(jas_vlogmsgf_discard);
end;
2. Создание собственной функции логирования
Если требуется более гибкое управление выводом сообщений, можно создать собственную функцию:
function MyJasPerLogger(typ: Cardinal; const fmt: PAnsiChar; args: Pointer): Integer; cdecl;
begin
// Здесь можно обрабатывать сообщения по своему усмотрению
// Например, записывать в файл или показывать в GUI
Result := 0; // Возвращаем 0 при успешной обработке
end;
// Установка собственного обработчика
procedure SetCustomLogger;
begin
jas_conf_set_vlogmsgf(@MyJasPerLogger);
end;
Альтернативные решения
Если описанные методы не работают или недоступны, можно рассмотреть следующие альтернативы:
Перенаправление STDOUT: Временно перенаправить стандартный вывод в файл или буфер:
Использование консоли только для ошибок: Сделать приложение GUI-based (Forms), тогда консольные сообщения не будут видны пользователю.
Модификация исходного кода JasPer: Если есть доступ к исходникам, можно пересобрать библиотеку с отключенным выводом сообщений.
Заключение
Подавление нежелательного вывода из внешних DLL - важная задача при разработке профессиональных приложений. В случае с JasPer наиболее правильным решением является использование встроенного механизма управления выводом сообщений через jas_conf_set_vlogmsgf. Это обеспечивает гибкость и не требует модификации стандартного поведения консоли.
Приведенные примеры кода на Object Pascal демонстрируют, как можно реализовать эту функциональность в Delphi и Lazarus, сохраняя контроль над выводом информации в приложении.
Статья описывает решение проблемы нежелательного вывода сообщений в STDOUT при работе с библиотекой JasPer в Delphi и Lazarus через перенаправление функции логирования или альтернативные методы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.