2012-03-15 10 views
6

Tengo un proceso que empiezo con CreateProcess, luego espero a que termine y verifique su código de salida. Lo hago en modo por lotes y no quiero que aparezcan cuadros de mensaje si el proceso falla. Es suficiente con devolver un código de salida distinto de cero que indicaría un error. Hasta ahora he intentado usar¿Cómo puedo suprimir todos los cuadros de diálogo de error cuando un proceso falla (solo quiero que se cuelgue silenciosamente)

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

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

    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); 

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

Pero esto no siempre es silencioso. A veces se muestra un cuadro de diálogo:

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

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



abnormal program termination 


--------------------------- 
OK 
--------------------------- 
+1

¿Está intentando en el modo de lanzamiento? – Konrad

+1

posible duplicado de [Impedir el diálogo modal en el bloqueo del proceso win32] (http://stackoverflow.com/questions/1861506/prevent-modal-dialog-on-win32-process-crash) –

Respuesta

10

desea suprimir dos cosas:

  1. OS modal usuario notifica de diálogo en accidente
  2. sus propios cuadros de diálogo apareció por el tiempo de ejecución

El primero lo hace con SetErrorMode solicitando SEM_FAILCRITICALERRORS y SEM_NOGPFAULTERRORBOX. El segundo puede suprimirse alterando el comportamiento de CRT con _set_abort_behavior.

En realidad, no necesita un controlador vacío con SetUnhandledExceptionFilter - no está haciendo nada importante allí. Demostrar que ningún controlador bloqueará el proceso y SetErrorMode (ver arriba) suprimirá la notificación del sistema operativo no deseado.

Código de ejemplo para hacerlo:

SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); 
_set_abort_behavior(0,_WRITE_ABORT_MSG); 
5

Usted está tratando con tres tipos de terminación anormal:

  1. no detectada excepciones de C++
  2. biblioteca de C++ que sale
  3. Win32 excecption no detectada.

En Windows, las excepciones de C++ suelen reutilizar partes de la gestión de excepciones Win32. Por lo tanto, su método se dirige a 1 y 3, pero falla 2. Es por eso que el mensaje proviene de "Biblioteca de tiempo de ejecución de Microsoft Visual C++". Necesitarás _set_abort_behavior(0, _WRITE_ABORT_MSG) para suprimir eso.

Cuestiones relacionadas