如题,SetUnhandledExceptionFilter为什么在VS2008无效?
同样的代码在VC7下好好的,完全可以使用。
为什么会这样?

解决方案 »

  1.   

    同样是windows xp 啊也加了下面代码了啊// 使 SetUnhandledExceptionFilter API 失效
    void CUnhandledExceptionCapture::Disable_SetUnhandledExceptionFilter()
    {
    void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")), "SetUnhandledExceptionFilter");
    if ( addr != NULL )
    {
    unsigned char code[16];
    int size = 0;
    code[size++] = 0x33;
    code[size++] = 0xC0;
    code[size++] = 0xC2;
    code[size++] = 0x04;
    code[size++] = 0x00; DWORD dwOldFlag, dwTempFlag;
    VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
    WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
    VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
    }
    }
      

  2.   


    DWORD dwOldFlag, dwTempFlag;
    VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
    WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
    VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
    我检测了返回值,都返回成功啊。
      

  3.   

    写在哪里?
    SetUnhandledExceptionFilter我写在InitInstance里面的。另外debug和Release对于这个处理也不一样。Release能处理的了,debug会被自带的调试机制抢占吊。
      

  4.   


    我是放在全局变量的构造函数里面的
    还加了#pragma init_seg(compiler)这个。
      

  5.   

    我是在dll里面定义的这个变量,然后dll被exe加载。
      

  6.   

    #include <dbghelp.h>
    dbghelp.lib都加了对吧?
      

  7.   


    // 我在崩溃发生前取出the top-level exception handler,发现为 NULL,
    // 那说明我设置的自定义异常处理函数被清掉了,SetUnhandledExceptionFilter(NULL);LPTOP_LEVEL_EXCEPTION_FILTER pp = SetUnhandledExceptionFilter(NULL);// pp == NULL // 发现 pp 为 NULL// 这是我的测试语句
    TCHAR* p = NULL;
    *p = 0;这应该说明下面这个函数
    // 使 SetUnhandledExceptionFilter API 失效
    void CUnhandledExceptionCapture::Disable_SetUnhandledExceptionFilter()
    {
        void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")), "SetUnhandledExceptionFilter");
        if ( addr != NULL )
        {
            unsigned char code[16];
            int size = 0;
            code[size++] = 0x33;
            code[size++] = 0xC0;
            code[size++] = 0xC2;
            code[size++] = 0x04;
            code[size++] = 0x00;
     
            DWORD dwOldFlag, dwTempFlag;
            VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
            WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
            VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
        }
    }
    失败了,可以我检查返回值都赶回 TRUE 啊,不懂了
      

  8.   

    结贴!
    研究了几天,终于有个了解了,虽然结果不是我想要的。
    我是在AutoCAD 2011 下用SetUnhandledExceptionFilter,今天发现在我用之前,
    AutoCAD 2011 已经将 SetUnhandledExceptionFilter hook 了,先我一步了,
    再等我使用 SetUnhandledExceptionFilter 的时候,被 AutoCAD 2011 直接"patching a return instruction into the asm" 了。我操……白忙活了几天!