02.2 A Crash Course on the Depths of Win32 Structured Exception Handling外文电子书籍.pdf

02.2 A Crash Course on the Depths of Win32 Structured Exception Handling外文电子书籍.pdf

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
A Crash Course on the Depths of Win32 Structured Exception Handling Matt Pietrek 著 董岩 译 在所有 Win32 操作系统提供的机制中,使用最广泛的未公开的机制恐怕就要数结构化异常 处理(structured exception handling ,SEH )了。一提到结构化异常处理,可能就会令人 想起 _try、_finally 和 _except 之类的词儿。在任何一本不错的 Win32 书中都会有 对 SEH 详细的介绍。甚至连 Win32 SDK 里都对使用 _try、_finally 和 _except 进行结构化 异常处理作了完整的介绍。既然有这么多地放都提到了 SEH ,那我为什么还要说它是未公 开的呢?本质上讲,Win32 结构化异常处理是操作系统提供的一种服务。编译器的运行时 库对这种服务操作系统实现进行了封装,而所有能找到的介绍 SEH 的文档讲的都是针对某 一特定编译器的运行时库。关键字 _try、_finally 和 _except 并没有什么神秘的。微软 的 OS 和编译器定义了这些关键字以及它们的行为。其它的 C++ 编译器厂商也只需要尊 从它们定好的语义就行了。在编译器的 SEH 层减少了直接使用纯操作系统的 SEH 所带来 的危害的同时,也将纯操作系统的 SEH 从大家的面前隐藏了起来。 我收到过大量的电子邮件说他们都需要实现编译器级的 SEH 但却找不到公开的文档。本来, 我可以指着 Visual C++ 和 Borlang C++ 的运行时库的源代码说看一下它们就行了。但是, 不知道是什么原因,编译器级的 SEH 仍是个天大的秘密。微软和 Borland 都没有提 供 SEH 最内层的源代码。 在本文中,我会从最基本的概念上讲解结构化异常处理。在讲解的时候,我会将操作系统 所提供的与编译器代码生成和运行时库支持的分离开来。当深入关键性操作系统程序的代 码时,我基于的都是 Intel 版的 Windows NT 4.0。然而。我所讲的大部分内容同样适用于 其它的处理器。 我会避免提及实际的 C++ 的异常处理,C++ 下用的是 catch() 而不是 _except。其实,真 正的 C++ 异常处理的实现方式和我所讲的方式也是极为相似的。但是,真正 C++ 异常处 理特有的复杂性会影响到我这里所讲的概念。对于深挖那些晦涩的 .H 和 .INC 文件并拼凑 出 Win32 SEH 的相关代码,最好的一个信息来源就是 IBM OS/2 的头文件(特别 是 BSEXCPT.H )。这对有相关经验的人并没什么可希奇的,这里讲的 SEH 机制在微软开 发 OS/2 时就定义了。因此,Win32 的 SEH 与 OS/2 的极为相似。 SEH in the Buff 若将 SEH 的细节都放到一起讨论,任务实在艰巨,因此,我会从简单的开始,一层一层往 深里讲。如果之前从未使用过结构化异常处理,则正好心无杂念。若是用过,那就要努力 将 _try、GetExceptionCode 和 EXCEPTION_EXECUTE_HANDLER 从脑子中扫出,假装这是一个全新的概念。 Are you ready ?Good。 当线程发生异常时 ,操作系统会将这个异常通知给用户使用户能够得知它的发生。更特别 的是,当线程发生异常时,操作系统会调用用户定义的回调函数。这个回调函数想做什么 就能做什么。例如,它可以修正引起异常的程序,也可以播放一段 .WAV 文件。无论回调 函数干什么,函数最后的动作都是返回一个值告诉系统下面该干些什么(这样说并不严格, 但目前可以认为是这样)。既然在用户代码引起异常后,操作系统会回调用户的代码,那 这个回调函数又是什么样的呢?换句话说,关于异常都需要知道哪些信息呢?其实无所谓, 因为 Win32 已经定义好了。异常的回调函数的样子如下: EXCEPTION_DISPOSITION __cdecl _except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ); 这个函数原型来自标准 Win32 头文件 EXCPT.H ,初看上去让人有点眼晕。如果慢慢看的 话,似乎情况还没那么严重。对于初学者来说,大可以忽略返回值的类 型 (EXCEPTION_D

文档评论(0)

独角戏 + 关注
实名认证
内容提供者

本人有良好思想品德,职业道德和专业知识。

1亿VIP精品文档

相关文档