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

Как подавить вывод предупреждений DLL JasPer в Delphi/Lazarus?

Delphi , Компоненты и Классы , Модули

 

При работе с внешними 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;

Альтернативные решения

Если описанные методы не работают или недоступны, можно рассмотреть следующие альтернативы:

  1. Перенаправление STDOUT: Временно перенаправить стандартный вывод в файл или буфер:
var
  OldStdOut: THandle;
  hPipeRead, hPipeWrite: THandle;
  sa: TSecurityAttributes;

procedure RedirectOutput;
begin
  sa.nLength := SizeOf(sa);
  sa.bInheritHandle := True;
  sa.lpSecurityDescriptor := nil;

  CreatePipe(hPipeRead, hPipeWrite, @sa, 0);
  OldStdOut := GetStdHandle(STD_OUTPUT_HANDLE);
  SetStdHandle(STD_OUTPUT_HANDLE, hPipeWrite);
end;

procedure RestoreOutput;
begin
  SetStdHandle(STD_OUTPUT_HANDLE, OldStdOut);
  CloseHandle(hPipeRead);
  CloseHandle(hPipeWrite);
end;
  1. Использование консоли только для ошибок: Сделать приложение GUI-based (Forms), тогда консольные сообщения не будут видны пользователю.

  2. Модификация исходного кода 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




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


:: Главная :: Модули ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:33:09/0.00364089012146/0