PDA

View Full Version : [VB] Richiamo funzione di sistema "Shell": s'accorge di mancate esecuzioni?


Matrixbob
10-06-2009, 10:38
Nell'esempio di codice sottostante:

Shell("C:\Programmi\mio_prg.exe -SYSIN '" & Nome_pgm & "' -LOG 'C:\mio_log.log' -NOSPLASH -ICON", AppWinStyle.NormalFocus, True)

, nel qualcaso l'eseguibile esista, ma l'esecuzione corretta fallisca "Shell" se ne accorgerebbe?

IMHO no, di cosa s'accorge "Shell" e di cosa no?

Matrixbob
10-06-2009, 10:53
Mmmm forse bisogna passare attraverso a queste cose:
http://msdn.microsoft.com/it-it/library/system.io.filenotfoundexception.aspx
http://msdn.microsoft.com/it-it/library/5eyd0ba7.aspx
http://msdn.microsoft.com/it-it/library/8a9f2ew0.aspx

MarcoGG
10-06-2009, 15:41
Usare la Shell è obbligatorio solo in VB6 / VBA. Se come penso stai usando VB.NET hai a disposizione uno strumento più potente e facile da usare :

System.Diagnostics.Process()

Puoi lanciare processi ( exe o files che richiamano l'exe registrato nel sistema per l'esecuzione ) esterni, monitorarli nel tempo, chiuderli ecc...

Ad es.:

Dim P As New System.Diagnostics.Process()
P.StartInfo.FileName = percorso & nomeFileExe
P.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal
P.StartInfo.ErrorDialog = True
P.Start()

P.WaitForExit()
MsgBox(P.ExitCode)
MsgBox(P.ExitTime)

Lancio un exe, con ErrorDialog = True decido di visualizzare un messaggio se l'esecuzione ha prodotto errori, con WaitForExit() faccio in modo di bloccare il thread chiamante finchè il Processo non termina.
In alternativa posso omettere WaitForExit(), creare un semplice Timer che interroga periodicamente lo stato di esecuzione :

If P.HasExited Then
'...
'...
MsgBox(P.ExitCode)
MsgBox(P.ExitTime)
End If

Sono solo alcune delle molte funzioni possibili con System.Diagnostics.Process(). ;)

Tornando alla Shell, monitorare lo stato del processo dopo il lancio è più laborioso... Una tecnica possibile è anche qui un Timer che interroga la lista dei processi attivi... In ogni caso Shell è un sistema molto più spinto verso l'operazione asincrona, e molto più slegato dall'applicazione che lo chiama, di quanto non sia System.Diagnostics.Process().

Matrixbob
16-06-2009, 09:50
Per fare il fork del C? Ovvero far nascere un processo figlio completamente indipendente dal padre?

MarcoGG
16-06-2009, 14:21
Per fare il fork del C? Ovvero far nascere un processo figlio completamente indipendente dal padre?

Beh, nel più sta il meno, quindi come già detto, l'essenziale è fare solo .Start() sul Process e non eseguire alcuna operazione di monitoraggio.
Il processo creato se ne andrà per i fatti suoi, che produca errori o meno, non interferirà con l'applicazione...