【发布时间】:2010-10-15 16:08:43
【问题描述】:
我在表单上有一个AxWMPLib.AxWindowsMediaPlayer。当我关闭表单时,我得到“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”例外。可以隐藏表单,但不能关闭。从表单中删除组件后一切正常。
这是 Winforms .Net3.5。
任何帮助表示赞赏。
【问题讨论】:
标签: winforms .net-3.5 activex windows-media-player wmp
我在表单上有一个AxWMPLib.AxWindowsMediaPlayer。当我关闭表单时,我得到“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”例外。可以隐藏表单,但不能关闭。从表单中删除组件后一切正常。
这是 Winforms .Net3.5。
任何帮助表示赞赏。
【问题讨论】:
标签: winforms .net-3.5 activex windows-media-player wmp
我想我有它:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
axWindowsMediaPlayer1.close();
}
只是在文档http://msdn.microsoft.com/en-us/library/windows/desktop/dd562388(v=vs.85).aspx上找到了方法 我想我会试一试。现在好像好多了。
【讨论】:
这发生在我身上,是在按键期间关闭表单时发生的。
如果 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 对象在垃圾箱中仍然保持活动状态,并且即使在它们被释放后也会尝试调用事件处理程序。
在尝试处理对象之前确保播放已停止也是值得的。
【讨论】:
_FormClosing() 事件中执行axWindowsMediaPlayer1.Dispose(); GC.WaitForPendingFinalizers(); GC.Collect(); 确实有帮助。
当父窗体关闭时,ActiveX 对象可能对以正确的顺序关闭有一些敏感的依赖关系,否则它们可能会继续存在直到 gc 运行 - 尝试通过该控件的接口查找任何看起来可能的方法与关闭或销毁对象并调用它们有关。
【讨论】: