近日,看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这一值来处理!!!!!
为什么会出现这种问题呢?
希望大家帮帮忙,顺便告诉我怎么样来解决这种问题,我没有思路啊。。。
谢谢各位大侠!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课