Исключение AccessViolation при закрытии формы с AxWindowsMediaPlayer

У меня есть AxWMPLib.AxWindowsMediaPlayer в форме. Когда я закрываю форму, я получаю «Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена». исключение. Можно скрывать форму, но не закрывать. Все нормально, когда компонент удаляется из формы.

Это Winforms .Net3.5.

Любая помощь приветствуется.


person David    schedule 26.03.2009    source источник


Ответы (4)


Это происходило со мной, и это было при закрытии формы во время нажатия клавиши.

Кажется, что элемент управления WMP вызовет проблемы, если ему нужно обработать ключевое событие.

Пример с Form.KeyPreview = True

Sub Form_KeyDown(e As KeyEventArgs)
 AxWindowsMediaPlayer1.Dispose()
End Sub

Вызывает нарушение прав доступа.

Sub Form_KeyDown(e As KeyEventArgs)
 e.Handled = True
 AxWindowsMediaPlayer1.Dispose()
End Sub

Закрывается чисто, так как нажатие клавиши блокируется от доступа к управлению WMP.

То же самое происходит, когда форма закрывается, так как элемент управления удаляется.

person WhoIsRich    schedule 26.05.2010

Иногда при работе с ActiveX-объектами в .NET-приложениях необходимо принудительно выполнять сборку мусора при выходе. Обычно я делаю это в Form_Closing, используя:

GC.WaitForPendingFinalizers()
GC.Collect()

Кроме того, если вы настроили какие-либо обработчики событий для объекта, вы захотите отключить их явно. Я обнаружил в ряде случаев, что объекты ActiveX по-прежнему остаются активными в мусорной корзине и пытаются вызвать обработчик событий даже после того, как они были удалены.

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

person Corin    schedule 09.09.2009
comment
Я обнаружил, что действительно помогло выполнение axWindowsMediaPlayer1.Dispose(); GC.WaitForPendingFinalizers(); GC.Collect(); внутри события _FormClosing(). - person v.oddou; 14.01.2014
comment
нет, это не... все еще нарушение. - person v.oddou; 14.01.2014

Объекты ActiveX могут иметь некоторые чувствительные зависимости от закрытия в правильном порядке при закрытии родительской формы, в противном случае они могут продолжать жить до тех пор, пока не запустится gc - попробуйте просмотреть интерфейс для элемента управления для любых методов, которые выглядят так, как будто они должны делать с закрытием или уничтожением объекта и вызовом тех.

person 1800 INFORMATION    schedule 26.03.2009
comment
Я пробовал останавливаться, сбрасывать исходный URL, закрывать, утилизировать, но безуспешно. Можем ли мы приблизиться к проблеме, найдя источник ошибки? Я еще не проверял журнал событий. - person David; 27.03.2009

Я думаю, что у меня есть это:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    axWindowsMediaPlayer1.close();
}

просто нашел метод в документе http://msdn.microsoft.com/en-us/library/windows/desktop/dd562388(v=vs.85).aspx Я решил попробовать. теперь кажется намного лучше.

person v.oddou    schedule 14.01.2014
comment
нет ведь тоже ничего хорошего. мы можем делать все, что захотим, этот элемент управления прослушивается, конец истории. Если бы у меня было время, я бы отказался от этого ужаса Microsoft и использовал библиотеки VLC. - person v.oddou; 15.01.2014