2009-03-23 9 views
13

Estoy iniciando un proceso externo con System.Diagnostics.Process. Esto es parte de un trabajo por lotes, por lo que si un proceso falla, me gustaría manejarlo y dejar que el resto continúe.Cómo manejar un bloqueo en un proceso iniciado mediante System.Diagnostics.Process?

Lo que sucede actualmente es que Windows muestra un cuadro de diálogo que me dice que el programa se ha bloqueado, y que solo una vez que he descartado eso, el proceso sale.

Según this question, la propiedad Process.Responding solo está disponible para programas con UI (el proceso que estoy iniciando es una aplicación de consola).

También miré los diversos eventos que proporciona un proceso, pero ninguno de ellos se dispara al estrellarse.

¿Alguna idea?

Respuesta

25

intente configurar el registro siguiente valor del registro a valor DWORD 2:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows\ErrorMode = 2 

Esto afectará a todos los procesos en la máquina.

Referencia: How to Get Rid of System and Application Popup Messages

Si tiene el código fuente para el programa que se estrella, se puede evitar que las ventanas emergentes por la captura de todas las excepciones estructuradas y salir sin aparecer un cuadro de mensaje. Cómo lo hace depende del lenguaje de programación utilizado.

Si no tiene la fuente, use la función SetErrorMode en el elemento primario para suprimir las ventanas emergentes. El modo de error es heredado por subprocesos. Debe establecer UseShellExecute en false para que esto funcione: "? ¿Quieres depurar utilizando el depurador seleccionado"

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 


namespace SubProcessPopupError 
{ 

    class Program 
    { 
     [DllImport("kernel32.dll", SetLastError = true)] 
     static extern int SetErrorMode(int wMode); 

     static void Main(string[] args) 
     { 
      int oldMode = SetErrorMode(3); 
      Process p; 
      ProcessStartInfo ps = new ProcessStartInfo("crash.exe"); 
      ps.UseShellExecute = false; 
      p = Process.Start(ps); 
      SetErrorMode(oldMode); 
      p.WaitForExit(); 
     } 
    } 
} 

Si recibe un cuadro de diálogo que dice, puede desactivarlo mediante el establecimiento de este valor del registro a 0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Auto = 0 

Sin embargo, no creo que esto ocurra si ha configurado el modo de error en 3 como se explicó anteriormente.

+0

Parece que esto iba a funcionar, pero es un poco como el uso de una espada para untar mantequilla Este programa tendrá que ejecutarse en las computadoras de otras personas, por lo que alterar las propiedades de todo el sistema no es una opción :( – meatvest

+0

Ver el párrafo adicional que agregué a mi respuesta. Si tiene el código fuente ... atrape todas las excepciones. –

+0

El bloqueo eso provocó que mi pregunta fuera causada durante la carga de las referencias del programa, el método Main() ni siquiera se había ingresado, lo que significaba que la excepción era (por lo que yo entiendo) imposible de detectar. – meatvest

0

Otra opción es ejecutar el ejecutable bajo cdb, y luego buscar la palabra "excepción", utilizando la siguiente línea de comandos:

cdb.exe -G -g -c "Q" <your executable> 
Cuestiones relacionadas