【问题标题】:AccessViolation exception when form with AxWindowsMediaPlayer closed关闭 AxWindowsMediaPlayer 的表单时出现 AccessViolation 异常
【发布时间】:2010-10-15 16:08:43
【问题描述】:

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

这是 Winforms .Net3.5。

任何帮助表示赞赏。

【问题讨论】:

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


    【解决方案1】:

    我想我有它:

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

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

    【讨论】:

    • 不,毕竟也不好。我们可以做任何我们喜欢的事情,这个控件被窃听,故事结束。如果我有时间,我会放弃这个微软的恐怖并使用 VLC 库。
    【解决方案2】:

    这发生在我身上,是在按键期间关闭表单时发生的。

    如果 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 控件。

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

    【讨论】:

      【解决方案3】:

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

      GC.WaitForPendingFinalizers()
      GC.Collect()
      

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

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

      【讨论】:

      • 我发现确实在_FormClosing() 事件中执行axWindowsMediaPlayer1.Dispose(); GC.WaitForPendingFinalizers(); GC.Collect(); 确实有帮助。
      • 不...仍然违规。
      【解决方案4】:

      当父窗体关闭时,ActiveX 对象可能对以正确的顺序关闭有一些敏感的依赖关系,否则它们可能会继续存在直到 gc 运行 - 尝试通过该控件的接口查找任何看起来可能的方法与关闭或销毁对象并调用它们有关。

      【讨论】:

      • 我试过停止、重置源 URL、关闭、处理但没有运气。我们可以通过找出错误的根源来更接近问题吗?我还没有检查事件日志。
      猜你喜欢
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2012-07-12
      • 1970-01-01
      相关资源
      最近更新 更多