我有AxWMPLib.AxWindowsMediaPlayer
一个表格。当我关闭表单时,我得到“试图读取或写入受保护的内存。这通常表明其他内存已损坏。” 例外。可以隐藏表单,但不能关闭。当组件从表单中删除时,一切都很好。
这是 Winforms .Net3.5。
任何帮助表示赞赏。
我有AxWMPLib.AxWindowsMediaPlayer
一个表格。当我关闭表单时,我得到“试图读取或写入受保护的内存。这通常表明其他内存已损坏。” 例外。可以隐藏表单,但不能关闭。当组件从表单中删除时,一切都很好。
这是 Winforms .Net3.5。
任何帮助表示赞赏。
这发生在我身上,它是在按键期间关闭表单时发生的。
如果 WMP 控件有要处理的关键事件,似乎 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 控件。
当表单关闭时会发生同样的事情,因为将处置控件。
有时在 .NET 应用程序中使用 ActiveX 对象时,有必要在退出时强制进行垃圾回收。我通常在 Form_Closing 中使用:
GC.WaitForPendingFinalizers()
GC.Collect()
此外,如果您为对象设置了任何事件处理程序,您将需要显式断开它们。我在很多情况下发现 ActiveX 对象在垃圾箱中仍然保持活动状态,并且即使在它们被释放后也会尝试调用事件处理程序。
在尝试处理对象之前确保播放已停止也可能是值得的。
当父窗体关闭时,ActiveX 对象可能对以正确的顺序关闭有一些敏感的依赖关系,否则它们可能会继续存在直到 gc 运行 - 尝试通过接口查找控件以查找它们可能必须执行的任何方法关闭或销毁对象并调用它们。
我想我有它:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
axWindowsMediaPlayer1.close();
}
只是在文档http://msdn.microsoft.com/en-us/library/windows/desktop/dd562388(v=vs.85).aspx上找到了该方法, 我想我会试一试。现在似乎好多了。