Buona sera a tutti
Vorrei, sviluppare un applicativo che mi esegua uno o più processi ".exe" e che mi consenta, qualora venissero chiusi o si verifichi un crash di riavviare quel processo.
Ho quindi utilizzato la classe process come di seguito
Dim pr as New Process
pr.StartInfo.FileName = Config.AppPath
pr.StartInfo.UseShellExecute = False
pr.StartInfo.ErrorDialog = False
pr.StartInfo.RedirectStandardError = True
AddHandler pr.ErrorDataReceived, AddressOf pr_ErrorDataReceived
pr.Start()
pr.BeginErrorReadLine()
AddHandler pr.Exited, AddressOf pr_Exited
pr.EnableRaisingEvents = True
In questo modo e tramite la gestione degli eventi Exited e ErrorDataReceived, riesco ad avviare il processo e monitorare quando viene chiuso.
Nel caso però in cui il processo eseguito vada in crash, e viene quindi visualizzata la classica finestra di windows di eccezione non gestita o di invio a Microsoft, non viene scatenato alcun evento e la proprietà "Responding" del processo, restituisce comunque "True". In questa situazione, all'applicazione di monitoring sembra tutto a posto mentre non lo è affatto.
Ho cercato quindi Online, e sembra che sia necessario utilizzare la funzione "SetErrorMode" per impedire la visualizzazione dei messaggi di Crash.
Ho implementato quindi la gestione di SetErrorMode, ma la finestra di errore, viene visualizzata comunque.
Continuando la ricerca Online, qualcuno, diceva che la SetErrorMode, in realtà, viene utilizzata nella funzione stessa ma non applicata ai processi "Figlio" che vengono creati.
Queste persone, dicevano di aver risolto implementando una classe che applicasse la SetErrorMode all'interno di un blocco Using; ma il risultato non cambia.
Qualche idea?
Classe che esegue il SetErrorMode:
Utilizzo della classe:
GRAZIE!
P.S. Ovviamente, è una applicazione di controllo processi generici, quindi, è logico che "non è possibile" implementare una gestione degli errori corretta all'interno del processo da controllare