Правильно распоряжаться QuickTime контроля - PullRequest
3 голосов
/ 15 марта 2010

В настоящее время я разрабатываю приложение для платформы Windows, которое сможет воспроизводить видео Quick Time. Целевые версии ОС: Windows XP, Windows Vista и Windows 7.

Я успешно использовал Apple ActiveX QuickTime Control 2.0 (в C #), и все хорошо работает в Windows XP.

Однако в Vista и Windows 7 я сталкиваюсь с проблемами при правильной утилизации элемента управления. Вот «шаги для воспроизведения»: - я динамически создаю элемент управления Quick Time во время выполнения и помещаю его на панель;

  • Я успешно проигрываю видео с ним;

  • В какой-то момент я закрываю основную форму приложения; окна приложения разрушены, и приложение продолжит работать в фоновом режиме (выполняя такие операции, как синхронизация видео); в этот момент элемент управления располагается с использованием шаблона IDisposable; Я не могу явно удалить объект Movie (из элемента управления ActiveX), потому что получаю исключение, например: «COM-объект, который был отделен от лежащего в его основе RCW, не может быть использован.»; Я просто использую (AxQTOControlLib.AxQTControl) player.Dispose (); В Windows XP это нормально, но не в Vista и 7

  • Я восстанавливаю свое приложение (из панели инструментов, где оно работало в фоновом режиме) и пытаюсь снова открыть видео; В этот момент создается исключение AccessViolationException «Попытка чтения / записи в защищенную память»;

Мои вопросы:

  • Почему это происходит только в Vista и Windows 7?

  • На XP скрытая утечка?

  • Каков рекомендуемый способ утилизации элемента управления (с его объектом фильма) при его создании во время выполнения?

Я сейчас использую явный вызов Movie.Disconnect () (хотя я сейчас не понимаю, что означает это отключение, потому что я не смог найти нужную документацию), за которым следует вызов QuickTimeTerminate () до закрытия формы. Пока мой метод работает, это своего рода нарушение дизайна, поэтому я хотел бы узнать лучший способ сделать это.

Спасибо, MOSU '

Обновление: Я только что обнаружил, что мой метод не работает. Я использую для проигрывателей: элемент управления QuickTime и элемент управления проигрывателем Windows Media (оба ActiveX), а когда один не удается воспроизвести файл, используется другой. Я видел выход плеера WindowsMedia и думал, что метод работает. Так что мое исправление не работает вообще.

1 Ответ

1 голос
/ 10 октября 2012

Многие люди, кажется, имеют эту ошибку.

Эта страница предлагает интересный подход: http://www.theusenetarchive.com/usenet-message-how-to-properly-destroy-quicktime-activex-object-10384503.htm

Сбой происходит из-за того, что файловые дескрипторы все еще открыты.Я «выгружал» фильмы из элемента управления Quicktime, связывая пустую строку со свойством FileName или URL.Quicktime не обрабатывает это правильно и оставляет исходный файл открытым.Поэтому вместо этого я связал путь к реальному файлу изображения (Quicktime также делает изображения), который был полностью черным.Теперь все хорошо.

...