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

### Разработка на Delphi: корректное чтение длительности AVI файлов с использованием JEDI Wrapper для WinAPI

Delphi , Синтаксис , Справочник по API-функциям

Разработка на Delphi: корректное чтение длительности AVI файлов с использованием JEDI Wrapper для WinAPI

Вопрос, поставленный перед разработчиками, заключается в необходимости чтения длительности AVI файлов для выявления нелегальных копий фильмов. В процессе реализации была написана программа на Delphi, использующая JEDI Wrapper для WinAPI. Однако, при попытке получить длительность файла, возникли проблемы.

Описание проблемы и решения

Проблема заключалась в двух моментах:

  1. Длительность фильма рассчитывалась неверно.
  2. При попытке освободить ресурсы после работы с файлом, происходил сбой с ошибкой доступа.

Исходный код

Пример кода, который вызвал проблемы, выглядит следующим образом:

uses WFV; // от JEDI api wrappers
procedure TForm1.Button1Click(Sender: TObject);
var
  lInfo: TAVIFILEINFO;
  lFile: IAVIFILE;
  lFileType: string;
  lLenMinutes: Integer;
  lFPS: Integer;
begin
  // Инициализация
  AVIFileInit;
  // Открытие файла
  AVIFileOpen(lFile, 'e:\Sideways KLAXXON\Sideways KLAXXON.avi', OF_READ, nil);
  // Получение информации о файле
  AVIFileInfoW(lFile, lInfo, SizeOf(lInfo));
  lFPS := Round(lInfo.dwRate / lInfo.dwScale);
  lLenMinutes := Round(lInfo.dwLength / lFPS / 60);
  // Работа с данными...
  // Освобождение ресурсов
  AVIFileRelease(lFile);
  FreeAndNil(lFile);
end;

Анализ проблемы

Проблема с расчетом длительности фильма заключалась в неправильном интерпретировании значений dwRate и dwScale. Для корректного расчета необходимо было использовать их правильное соотношение.

Ошибка с доступом при освобождении ресурсов была вызвана тем, что после вызова AVIFileRelease, переменная lFile все еще содержала ссылку на интерфейс, и попытка освободить ее через FreeAndNil приводила к ошибке.

Подтвержденное решение

Для решения проблемы необходимо было:

  1. Убедиться, что после вызова AVIFileRelease переменная lFile не используется для дальнейших операций, которые могут попытаться уменьшить счетчик ссылок.
  2. Изменить способ освобождения переменной lFile, так как она представляет собой интерфейс COM, а не объектный тип, поддерживаемый FreeAndNil. Вместо этого, достаточно просто установить значение переменной в nil.
lFile := nil;

Также, для полноты картины, следует добавить вызов AVIFileExit, чтобы соответствовать инициализации AVIFileInit.

Альтернативное решение

В качестве альтернативы, можно использовать приведение типа к указателю и установить его в nil:

pointer(lFile) := nil;

Это предотвратит попытку уменьшения счетчика ссылок, которая приводила к ошибке.

Заключение

При работе с интерфейсами COM в Delphi важно правильно управлять жизненным циклом объектов, особенно при использовании внешних библиотек, таких как JEDI Wrapper для WinAPI. В данном случае, корректное освобождение ресурсов и понимание механизма управления ссылками позволили решить проблему с чтением длительности AVI файлов.

Создано по материалам из источника по ссылке.

Краткое описание контекста: Разработчики сталкиваются с проблемами при корректном чтении длительности AVI файлов в программе на Delphi с использованием JEDI Wrapper для WinAPI, что необходимо для выявления нелегальных копий фильмов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Справочник по API-функциям ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:13:16/0.0033450126647949/0