我已經將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