Я импортировал COM-интерфейс IPreviewHandler
в приложение WinForms и использую его для отображения превью для различных типов документов (я просматриваю GUID соответствующего обработчика предпросмотра в реестре, а затем используйте Activator.CreateInstance(guid)
для экземпляр определенного класса COMIPreviewHandler выдает исключение uncatchable
Это работает удивительно для подавляющего большинства типов файлов -. форматов Office, PDF-файлы, видео и т.д. - однако, после того, как я экземпляр «Microsoft Windows TXT Preview Handler» {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 хостинг Process аварий. Без отладчика приложение аварийно завершает работу, не запуская события AppDomain.UnHandledException
или Application.ThreadException
.
На самом деле я не имею в виду, что я не могу просматривать текстовые файлы, используя эту технику (рабочие обработчики предварительного просмотра для форматов Office и т. Д. Достаточны для требований моего приложения), но я обеспокоен тем, если пользователь выбирает файл .txt. Есть ли способ поймать эту ошибку и обработать ее изящно? Еще лучше, можно ли каким-то образом преодолеть это и заставить обработчик работать?
Отсутствует тип библиотеки. Как вы «импортировали» объявления интерфейса? –
@Hans Passant: объявление вручную с использованием атрибутов '[ComImport]' и '[Guid]'. Посмотрите исходный код в своем блоге: http://www.brad-smith.info/blog/archives/79 –