读书人

【】关于SEH的一点疑问

发布时间: 2012-02-12 17:16:34 作者: rapoo

【求助】关于SEH的一点疑问
近日,看Jeffry Richter著的那本《Windows核心编程》看到异常过滤程序和异常处理程序时,感觉书上的代码好像不太对劲,就巧入VC中,发现一个问题,但是我解决不了,希望大侠能够来看看,帮我解决一下。
根据原书代码(588页589页)大致如下,我编写的代码如下:
#include <windows.h>
#include <STDIO.H>
char g_szBuffer[20]= "cba ";
#if 0 //这个函数与下个同名函数由自己选择
void FuncSinatra2(char *sz)
{
__try
{
*sz=0;

}
__except(EXCEPTION_CONTINUE_SEARCH)
{
this never execute
}
}
#endif
#if 1
void FuncSinatra2(char *sz)
{

*sz=0;

}
#endif
DWORD OilFilter2(char **lplpBuffer)
{
if(*lplpBuffer==NULL)
{
*lplpBuffer=g_szBuffer;
return (EXCEPTION_CONTINUE_EXECUTION);
}
return (EXCEPTION_EXECUTE_HANDLER);
}
void FunclinRoosevelt2(void)
{
char *lpBuffer=NULL;

__try
{
FuncSinatra2(lpBuffer);
}
__except(OilFilter2(&lpBuffer))//标号一:这个标号下面有相关问题
{
MessageBox(NULL, "ok ", "ok ",MB_OK);
}
}


int main(int argc, char* argv[])
{

FunclinRoosevelt2();


return 0;
}

原书上的意思是两个FuncSinatra2函数,一个能够优雅的结束(第二个),另一个则在处理完异常后,由于局部变量sz的值没有改变,从失败的指令恢复执行会产生另一个异常,陷入了死循环(第一个)。
但是我感觉第二个也只是把NULL压栈了,也应该是死循环。
于是,我运行,奇怪的事情发生了:
两个程序都没有死循环!
由于发生异常的情况我们清楚的知道(访问NULL了),于是我把标号一处改为:
__except(OilFilter2(&lpBuffer),EXCEPTION_CONTINUE_EXECUTION)
这样,两个函数运行情况就如我所想的,都死循环了!
难道是OilFilter2运行有问题?可是我调试,看到返回的值就是EXCEPTION_CONTINUE_EXECUTION(即OXFFFFFFFF)。但是明显的except()中用了EXCEPTION_EXECUTE_HANDLER这一值来处理!!!!!
为什么会出现这种问题呢?
希望大家帮帮忙,顺便告诉我怎么样来解决这种问题,我没有思路啊。。。
谢谢各位大侠!

[解决办法]
MARK,从来不用异常。

[解决办法]
seh挂接到异常后,做出处理,然后会有一个ax的返回值,根据该值的不同做对应的处理,继续执行?结束?抛出到系统??等等

读书人网 >VC/MFC

热点推荐