我有一个包含多个 Windows Media Player COM 控件实例的表单。播放电影一段时间后,它崩溃了。我得到一个对话框窗口,它告诉应用程序存在问题,它将被关闭。错误报告包含有关导致错误的模块的信息,它的名称是 lavvideo.ax 可能是某种编解码器问题,但我还是想捕捉这个异常。可能吗?try/catch 块不起作用。
问问题
1162 次
2 回答
1
在本机代码 COM 或 pInvoke 中发生的异常无法从 .NET 运行时环境中捕获。COM 不支持将异常从被调用者(可以用任何语言实现)传播到调用者,原因是异常引发和捕获机制需要被调用者和调用者双方的参与或支持,因为 COM 是不可能的语言(C# 或 C++)不可知。
只是为了完整起见,我想说一个进程外 COM 对象将有助于使您的应用程序免于崩溃并意识到 COM 对象崩溃并可能重新实例化它们。在大多数 COM 对象实现中,进程外 COM 对象实例化经常失败(由于假设和捷径) - 啊,位置透明度在哪里?
于 2012-11-28T12:34:41.527 回答
1
Windows Media Player ActiveX 控件是一个 COM 组件,仅当您嵌入到您的 dot net 应用程序时才在进程内。这个 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();
您应该能够使用类似于以下的 try catch 来捕获大多数 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 实例播放视频和静态数据 - 许多文件设置为循环播放,有些文件通过各种方式手动控制。
于 2018-08-30T22:47:01.653 回答