首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

【】关于SEH的一点疑问

2012-02-12 
【求助】关于SEH的一点疑问近日,看JeffryRichter著的那本《Windows核心编程》看到异常过滤程序和异常处理程序

【求助】关于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的返回值,根据该值的不同做对应的处理,继续执行?结束?抛出到系统??等等

热点排行