none
请问如何让程序出异常时静默退出,不弹出任何提示,这对无人值守很重要。 RRS feed

  • 问题

  • 最近写了一个需要无人值守的程序,需要该程序出异常时静默退出,由另一个监控程序将其自动启动

    但是如何避免出异常时弹出“错误信息”对话框,成了一个棘手的问题,查了很多资料,很多方案,还是不能屏蔽所有的异常提示对话框。

    尝试在CMyWinApp::InitInstance() 加入

     SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX|SEM_NOALIGNMENTFAULTEXCEPT);

    加入

    SetUnhandledExceptionFilter(DummyUnhandledExecptionFilter);

    甚至Hook kernel32.dll中的UnhandledExceptionFilter

    LONG WINAPI DummyUnhandledExecptionFilter(_EXCEPTION_POINTERS* ExecptionInfo)
    {	
    	return EXCEPTION_EXECUTE_HANDLER;
    }
    
    
    void HookUnhandledExceptionFilter()
    {  
    	//注意这里是e9的jmp指令,不是e8的call指令
    	BYTE NewBytes[5] = {0xe9,0x0,0x0,0x0,0x0};  
    
    	BYTE OldBytes[5] = {0, 0, 0, 0, 0};
    		
    	LPTOP_LEVEL_EXCEPTION_FILTER pOldFunc = (LPTOP_LEVEL_EXCEPTION_FILTER)GetProcAddress(GetModuleHandle("kernel32.dll"), "UnhandledExceptionFilter"); 
    	LPTOP_LEVEL_EXCEPTION_FILTER pNewFunc = DummyUnhandledExecptionFilter;
    	if(pOldFunc && ReadProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)pOldFunc, OldBytes, 5, NULL))
    	{
    		*(DWORD*)(NewBytes+1) = (DWORD)pNewFunc - (DWORD)pOldFunc - 5;
    		BOOL bRet = WriteProcessMemory(INVALID_HANDLE_VALUE, pOldFunc, NewBytes, 5, NULL);
    		TRACE("\n lastError = %u", GetLastError());
    	}
    	else
    	{
    		TRACE("\n lastError = %u", GetLastError());
    	}
    }


    也无法阻止一些异常提示对话框,比如Error : Runtime error 217 at 00E6E33E ,  还有一些第三方DLL导致的异常提示对话框。

    还有就是对OS的一些设置:比如禁用windows Error Reporting,比如设置HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows中的ErrorMode的值为2

    这些都不能阻止异常提示对话框。

    就想问问怎么样才能做到程序出异常时安安静静的退出就好了。

    运行环境:windows XP sp3 32bit  

    开发工具: Visual C++ 6


    2015年6月3日 3:50

全部回复

  • 参考这篇blog: windows程序崩溃对话框和异常处理

    http://blog.csdn.net/ibingow/article/details/7104346

    我没有试过,不知道可不可行。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年6月4日 2:35
  • 感谢指点。

    我的工作程序用了一个第三方的DLL,异常就是来自第三方的DLL,我没有办法控制第三方DLL的代码。

    我有个思路:写一个单独的守护程序,在这个守护程序里以DEBUG_ONLY_THIS_PROCESS方式启动工作程序,如果工作程序产生了异常,就会以DEBUG_EVENT的方式通知守护程序,根据DEBUG_EVENT的类型由守护程序结束工作程序

    但实际测试结果是造成了我的工作程序运行不正常,不知道是不是因为这个第三方的DLL用了Anti-Debug技术。

    2015年6月10日 6:56