Как я могу подавить все диалоги ошибок при сбое процесса (я только хочу, чтобы он зависал тихо) - PullRequest
7 голосов
/ 15 марта 2012

У меня есть процесс, который я запускаю с CreateProcess, затем жду его завершения и проверяю его код выхода.Я делаю это в пакетном режиме и не хочу, чтобы при сбое процесса отображались какие-либо окна сообщений.Достаточно просто вернуть ненулевой код выхода, который будет указывать на ошибку.До сих пор я пытался использовать

LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS *lpTopLevelExceptionFilter)
{
    ExitProcess(-1);
    return EXCEPTION_EXECUTE_HANDLER;
}

BOOL CMyApp::InitInstance()
{
    AfxEnableControlContainer();

    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);

    throw std::runtime_error("test");
}

Но это не всегда молчит.Иногда отображается диалоговое окно:

---------------------------
Microsoft Visual C++ Runtime Library
---------------------------
Runtime Error!

Program: C:\Workspace\MyApp\Release\MyApp.exe



abnormal program termination


---------------------------
OK   
---------------------------

Ответы [ 2 ]

10 голосов
/ 15 марта 2012

Вы хотите подавить две вещи:

  1. Модальное диалоговое окно ОС, уведомляющее пользователя о сбое
  2. Ваши собственные диалоги всплывают во время выполнения

Первоевы делаете с SetErrorMode, запрашивающими SEM_FAILCRITICALERRORS и SEM_NOGPFAULTERRORBOX.Второе можно подавить, изменив поведение CRT с помощью _set_abort_behavior.

На самом деле вам не нужен пустой обработчик с SetUnhandledExceptionFilter - вы не делаете там ничего важного.Доказательство того, что никакой обработчик не приведет к сбою процесса, и SetErrorMode (см. Выше) подавит нежелательное уведомление ОС.

Пример кода для этого:

SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
_set_abort_behavior(0,_WRITE_ABORT_MSG);
5 голосов
/ 15 марта 2012

Вы имеете дело с тремя видами ненормального завершения:

  1. Uncaught C ++ исключение
  2. Выход из библиотеки C ++
  3. Неопределенное исключение Win32.

В Windows исключения C ++ обычно повторно используют части обработки исключений Win32. Поэтому ваш метод обращается к 1 и 3, но пропускает 2. Вот почему сообщение приходит из "Microsoft Visual C ++ Runtime Library". Вам нужно будет _set_abort_behavior(0, _WRITE_ABORT_MSG), чтобы подавить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...