c# – IPreviewHandler抛出无法捕获的异常
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – IPreviewHandler抛出无法捕获的异常,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2736字,纯文字阅读大概需要4分钟。
内容图文
![c# – IPreviewHandler抛出无法捕获的异常](/upload/InfoBanner/zyjiaocheng/754/c688bc9091b445c881c843d9907c1c02.jpg)
我已经将COM接口IPreviewHandler导入到WinForms应用程序中并使用它来显示各种类型文档的预览(我在注册表中查找相应预览处理程序的GUID,然后使用Activator.CreateInstance(guid)来实例化特定的COM类.
这适用于绝大多数文件类型 – 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 Hosting Process崩溃了.如果没有调试器,应用程序将崩溃而不会触发AppDomain.UnHandledException或Application.ThreadException事件.
我真的不介意我无法使用这种技术预览纯文本文件(Office格式的工作预览处理程序等足以满足我的应用程序的要求),但我担心如果用户选择我的应用程序会无法控制地崩溃一个.txt文件.有什么方法可以捕捉到这个错误并优雅地处理它?更好的是,有什么方法可以克服它并使处理程序工作?
解决方法:
我无法让GetPreviewHandlerGUID()识别.txt文件并且必须直接注入GUID.使用Project Properties,Debug,tick启用非托管代码调试时,您可以看到出现了什么问题.
调试器现在将停止问题并显示
`STATUS_STACK_BUFFER_OVERRUN encountered
调用堆栈的顶部如下所示:
kernel32.dll!_UnhandledExceptionFilter@4() + 0x1a368 bytes
shell32.dll!___report_gsfailure() + 0xc8 bytes
shell32.dll!CRTFPreviewHandler::_StreamInCallback() + 0x74 bytes
msftedit.dll!CLightDTEngine::ReadPlainText() + 0xed bytes
msftedit.dll!CLightDTEngine::LoadFromEs() + 0x202b3 bytes
msftedit.dll!CTxtEdit::TxSendMessage() + 0x1e25f bytes
msftedit.dll!_RichEditWndProc@16() + 0x13d bytes
问题出在StreamInCallback()函数中.它由RichTextBox调用,用于显示加载文件的预览(msftedit.dll).此回调函数中的代码有一个错误,它会破坏用于检测堆栈帧因缓冲区溢出而损坏的“canary”.
这是微软采取措施防止病毒通过缓冲区溢出注入自身的措施的一部分. Visual Studio中用于C/C++语言的/ GS编译选项.一旦检测到,CRT就会很快终止程序.这种情况发生时没有异常被提升,堆栈无法安全解开,因为它已被泄露.因此,CLR无法捕获异常.
此错误特定于TXT文件查看器.除了不使用它之外,你无能为力.将此错误报告给connect.microsoft.com可能没用,他们会将其关闭为“外部”.这是一个微妙的提示,当您让非托管代码在您的程序中运行时会发生什么;)
内容总结
以上是互联网集市为您收集整理的c# – IPreviewHandler抛出无法捕获的异常全部内容,希望文章能够帮你解决c# – IPreviewHandler抛出无法捕获的异常所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。