近日,看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这一值来处理!!!!!  
     为什么会出现这种问题呢?
     希望大家帮帮忙,顺便告诉我怎么样来解决这种问题,我没有思路啊
谢谢各位大侠!