我已经将COM接口IPreviewHandler
导入到WinForms应用程序中,并使用它来显示各种类型文档的预览(我在注册表中查找相应预览处理程序的GUID,然后使用Activator.CreateInstance(guid)
实例的具体COM类IPreviewHandler引发无法捕捉的异常
这工作奇妙的绝大多数文件类型 - Office格式,PDF文件,视频等 - 但是,我实例化“的Microsoft Windows TXT预览处理” {1531d583-8375-4d3f-b5fb-d23bbd169f22}
后,用初始化它一个包含普通.txt文件的流,设置预览窗口的边界,然后最终调用DoPreview()
,我得到一个无法捕获的异常使用try ... catch:
try {
Type comType = Type.GetTypeFromCLSID(guid);
object handler = Activator.CreateInstance(comType);
if (handler is IInitializeWithStream) {
Stream s = File.Open(filename, FileMode.Open);
// this just passes the System.IO.Stream as the COM type IStream
((IInitializeWithStream)handler).Initialize(new StreamWrapper(s), 0);
}
else {
throw new NotSupportedException();
}
RECT r = new RECT();
r.Top = 0;
r.Left = 0;
r.Right = hostControl.Width;
r.Bottom = hostControl.Height;
((IPreviewHandler)handler).SetWindow(hostControl.Handle, ref r);
((IPreviewHandler)handler).DoPreview(); // <-- crash occurs here
}
catch (Exception) {
// this will never execute
}
当我使用调试程序时,Visual Studio宿主进程崩溃。如果没有调试器,则应用程序崩溃而不会触发AppDomain.UnHandledException
或Application.ThreadException
事件。
我并不介意使用这种技术无法预览纯文本文件(对于Office格式等的工作预览处理程序对于我的应用程序的要求已足够),但是我担心应用程序崩溃失控应该用户选择一个.txt文件。有什么办法可以捕捉到这个错误并且优雅地处理它吗?更好的是,有什么方法可以克服它并让处理程序起作用?
没有类型库。你是如何“导入”接口声明的? – 2010-08-30 20:28:48
@Hans Passant:使用'[ComImport]'和'[Guid]'属性进行手动声明。看到我的博客上的源代码:http://www.brad-smith.info/blog/archives/79 – 2010-08-30 23:21:02