最近写了一个需要无人值守的程序,需要该程序出异常时静默退出,由另一个监控程序将其自动启动。
但是如何避免出异常时弹出“错误信息”对话框,成了一个棘手的问题,查了很多资料,很多方案,还是不能屏蔽所有的异常提示对话框。
尝试在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