正确处理QuickTime控件

3
我目前正在开发一个Windows平台的应用程序,可以播放Quick Time视频。目标操作系统版本是Windows XP、Windows Vista和Windows 7。
我成功地使用了Apple ActiveX QuickTime Control 2.0(在C#中),在Windows XP上一切都运行良好。
然而,在Vista和Windows 7上,我遇到了正确处理控件的问题。以下是“重现步骤”:
- 我在运行时动态创建Quick Time控件,并将其放置在面板上; - 我可以成功地使用它播放视频; - 在某个时候,我关闭应用程序的主窗体;应用程序窗口被销毁,应用程序将继续在后台运行(执行诸如同步视频之类的操作);此时,使用IDisposable模式处理控件;我不能显式释放ActiveX控件中的Movie对象,因为我会得到一个异常,如:“已与其基础RCW分离的COM对象无法使用。”;我只需使用(AxQTOControlLib.AxQTControl)player.Dispose();在Windows XP上这很好,但在Vista和7上不行。 - 我恢复我的应用程序(从工具栏中它在后台运行),并再次尝试打开视频;此时,会抛出AccessViolationException“试图读取/写入受保护的内存”;
我的问题是:
- 为什么这只发生在Vista和Windows 7上? - 在XP上是一个隐藏的泄漏吗? - 当在运行时创建控件时,推荐的处理控件(及其电影对象)的方式是什么?
我现在使用显式的Movie.Disconnect()调用(尽管我不知道这个断开连接意味着什么,因为我找不到适当的文档),然后关闭表单之前调用QuickTimeTerminate()。虽然我的方法有效,但它有点破坏设计,所以我想知道更好的方法。
谢谢, Mosu'
更新: 我刚刚发现我的方法不起作用。我使用了两个播放器:QuickTime控件和Windows Media Player控件(都是ActiveX),当一个无法播放文件时,使用另一个。我看到的是WindowsMedia player的输出,认为这个方法有效。所以我的修复根本不起作用。

呃,这个控件有点糟糕。试着隐藏你的窗体而不是销毁它。 - Hans Passant
感谢您的回复。我无法这样做,因为所有其他控件(包括控件所在的面板)都已被处理。该应用程序处于成熟状态。我被要求添加此功能。因此,这不是一个选项。 - mosu
很不幸,我也遇到了同样的问题。 - simon.d
1个回答

1

很多人似乎都遇到了这个错误。

这个页面提供了一个有趣的方法:http://www.theusenetarchive.com/usenet-message-how-to-properly-destroy-quicktime-activex-object-10384503.htm

崩溃是因为文件句柄仍然处于打开状态。我通过将空字符串连接到FileName或URL属性来“卸载”Quicktime控件中的电影。Quicktime无法正确处理此操作并保留原始文件的打开状态。所以,我改为将路径连接到实际的黑色图像文件(Quicktime也可以处理图像)。现在一切看起来都很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接