Reputation: 79595
I have a process which I start with CreateProcess, then I wait for it to finish and check its exit code. I do this in batch mode and I don't want any message boxes to show up if the process crashes. It's enough to just return a nonzero exit code which would indicate failure. So far I've tried using
LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS *lpTopLevelExceptionFilter)
{
ExitProcess(-1);
return EXCEPTION_EXECUTE_HANDLER;
}
BOOL CMyApp::InitInstance()
{
AfxEnableControlContainer();
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
throw std::runtime_error("test");
}
But this isn't always silent. Sometimes it displays a dialog:
---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Runtime Error!
Program: C:\Workspace\MyApp\Release\MyApp.exe
abnormal program termination
---------------------------
OK
---------------------------
Upvotes: 9
Views: 7986
Reputation: 69706
You want to suppress two things:
The first you do with SetErrorMode
requesting SEM_FAILCRITICALERRORS
and SEM_NOGPFAULTERRORBOX
. The second can be suppressed by altering CRT behavior with _set_abort_behavior
.
You don't actually need an empty handler with SetUnhandledExceptionFilter
- you are not doing anything important there. Proving no handler would crash the process and SetErrorMode
(see above) will suppress the unwanted OS notification.
Sample code to do it:
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
_set_abort_behavior(0,_WRITE_ABORT_MSG);
Upvotes: 11
Reputation: 179991
You're dealing with three kinds of abnormal termination:
On Windows, C++ exceptions typically reuse parts of Win32 exception handling. Therefore your method addresses 1 and 3, but misses 2. That's why the message is coming from "Microsoft Visual C++ Runtime Library". You'll need _set_abort_behavior(0, _WRITE_ABORT_MSG)
to suppress that.
Upvotes: 5