我正在尝试通读这里链接的“关于Win32结构化异常处理的深度的速成课程”的Matt Pietrek文章。在标题为“编译器级SEH”的部分中,他写道:


现在您知道_try块与堆栈上的EXCEPTION_REGISTRATION结构相对应,那么EXCEPTION_ REGISTRATION中的回调函数呢? ?使用Win32术语,异常回调函数对应于filter-expression代码。为了刷新您的内存,filter-expression是_except关键字后的parens代码。正是这个过滤器表达式代码决定了后续{}块中的代码是否将执行。


此时,我有些困惑。一直以来,直到这一点,我一直认为回调函数是要处理异常的函数,即_except块中的代码。请帮助我理解这一点。

此外,如果filter-expression代码与回调函数相对应,那么filter-expression后与'{}'内的代码相对应?

#1 楼

对于编译器级SEH,操作系统调用的回调是编译器提供的功能,通常为__except_handler3或类似功能。调用后,它将检查堆栈,检索trylevel,查找相应的作用域表条目并调用异常过滤器(lpfnFilter)。如果过滤器返回非零值,则调用处理程序(lpfnHandler)-这是与__except/__finally块内的代码相对应的代码。
有关特定示例,请在此处查看附录I:http://www.openrce .org / articles / full_view / 21

请注意,与“简单” SEH相比,C ++ EH使用稍微更复杂的方法来确保正确的语义(例如展开时的自动对象销毁),因此不是易于映射回源代码,但可行(请参见上一篇文章的附录II)。

BTW,在最近的Visual Studio版本中,Microsoft提供了几乎完整的CRT源代码,包括__except_handlerN___CxxFrameHandler的实现,因此您也可以在那里查看(例如\Program Files (x86)\Microsoft Visual Studio 11.0\VC\crt\src\eh\frame.cpp)。