关闭AxWindowsMediaPlayer的表单时的AccessViolation异常

时间:2009-03-26 10:28:22

标签: winforms .net-3.5 activex windows-media-player wmp

我在表单上有一个AxWMPLib.AxWindowsMediaPlayer。当我关闭表单时,我会“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”例外。隐藏表单是可以的,但不是关闭。从表单中删除组件时一切都很好。

这是Winforms .Net3.5。

任何帮助表示感谢。

4 个答案:

答案 0 :(得分:3)

这发生在我身上,而且是在关键时刻关闭表格的时候。

如果要处理关键事件,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控制。

当窗体关闭时会发生同样的事情,就像处理控件一样。

答案 1 :(得分:2)

有时在.NET应用程序中使用ActiveX对象时,必须在退出时强制执行垃圾回收。我通常在Form_Closing中使用:

执行此操作
GC.WaitForPendingFinalizers()
GC.Collect()

此外,如果您为对象设置了任何事件处理程序,则需要显式断开它们。我发现ActiveX对象在垃圾箱中仍然保持活动状态,并且即使在它们被处理后也会尝试调用事件处理程序。

在尝试处理对象之前,确保播放已停止也是值得的。

答案 2 :(得分:0)

当父窗体关闭时,ActiveX对象可能会以正确的顺序关闭一些敏感的依赖关系,否则它们可能会继续生效直到gc运行 - 尝试查看控件的界面,看看它们看起来像是什么样的方法与关闭或摧毁对象并调用它们有关。

答案 3 :(得分:0)

我想我拥有它:

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

只需在文档http://msdn.microsoft.com/en-us/library/windows/desktop/dd562388(v=vs.85).aspx上找到该方法 我以为我会试一试。现在似乎好多了。