我有一个包含多个Windows Media Player COM控件实例的表单。播放电影一段时间后,它崩溃了。我得到一个对话窗口,告诉应用程序有问题,它将被关闭。错误报告包含有关导致错误的模块的信息,其名称为lavvideo.ax 可能是某种编解码器问题,但是我想抓住这个例外。可能吗? try / catch块不起作用。
答案 0 :(得分:0)
无法从.NET运行时环境中捕获本机代码COM或pInvoke中发生的异常。 COM不支持将来自被调用者的异常(可以用任何语言实现)传播给调用者,原因是异常提升和捕获机制需要来自被调用者和调用者的参与或支持,这是不可能的,因为COM是语言(C#或C ++)不可知。
仅仅为了完成,我想说一个进程外的COM对象将有助于保护您的应用程序不会崩溃并且意识到COM对象崩溃并可能重新实例化它们。在大多数COM对象实现中经常出现进程外COM对象实例化失败(由于假设和捷径) - 啊位置透明度在哪里?
答案 1 :(得分:0)
Windows Media Player ActiveX控件是一个COM组件,仅当您嵌入点网应用程序时才可以使用。这个COM组件可以传回COM异常-我将它与AxWindowsMediaPlayer对象的多达8个实例一起使用,而在我的C#应用程序中没有任何问题。我实例化这样的实例:
Movement
您应该能够通过以下尝试捕获大多数COM错误:
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();
我可以同时向这些AxWMP实例播放视频和静态图像,而不会出现问题-许多文件设置为循环播放,有些则通过各种方式手动控制。