具有多个Windows 媒体播放器控件实例的应用程序崩溃



我有一个表单,其中包含Windows Media Player COM控件的多个实例。播放电影一段时间后,它会崩溃。我得到对话框窗口,告诉应用程序有问题,它将被关闭。错误报告包含有关导致错误的模块的信息,其名称为 lavvideo.ax可能是某种编解码器问题,但尽管如此,我还是想抓住这个异常。可能吗?尝试/捕获块不起作用。

无法从 .NET 运行时环境中捕获本机代码 COM 或 pInvoke 中发生的异常。COM 不支持将异常从被调用方(可以用任何语言实现)传播到调用方,原因是异常引发和捕获机制需要被调用方和调用方的参与或支持,这变得不可能,因为 COM 是语言(C# 或 C++)不可知。

只是为了完成,我想说一个进程外的 COM 对象将有助于使您的应用程序免于崩溃,并意识到 COM 对象崩溃并可能重新实例化它们。在大多数 COM 对象实现上,进程外 COM 对象实例化经常失败(由于假设和快捷方式) - 啊,位置透明度在哪里?

Windows Media Player ActiveX 控件是一个 COM 组件,仅当您嵌入到点网应用程序中时,它才在进程中。这个COM组件可以传回COM异常 - 我使用它最多8次AxWindowsMediaPlayer对象的初始化,在我的C#应用程序中没有问题。我像这样实例化实例:

   axWMPn[zi] = new AxWindowsMediaPlayer();
   ((ISupportInitialize)(axWMPn[zi])).BeginInit();
   axWMPn[zi].Name = "Zone " + zi;     // this would be the Zone name passed
   axWMPn[zi].Tag = "Z" + zi;  // this is a "Z" and the Zone index
   axWMPn[zi].Location = loc;
   axWMPn[zi].Size = sz;
   Controls.Add(axWMPn[zi]);
   ((ISupportInitialize)(axWMPn[zi])).EndInit();

您应该能够通过类似于以下内容的尝试捕获捕获大多数 COM 错误:

    private void playVideo(string file)
    {
        int tc6 = 0;
        try
        {
            axWMPn[0].URL = file;
        }
        catch (System.Runtime.InteropServices.COMException comEx)
        {
            Console.WriteLine("playVideo COMException 0: " + comEx.Source + "  -- " + comEx.Message);
        }

我可以同时向这些 AxWMP 实例播放视频和静态数据,而不会出现问题 - 许多文件设置为循环播放,有些文件是通过各种方式手动控制的。

最新更新