Condividi tramite


Funzione Shell

Aggiornamento: novembre 2007

Esegue un programma eseguibile e restituisce un valore integer che contiene l'ID di processo del programma, se ancora in esecuzione.

Public Function Shell( _
   ByVal PathName As String, _ 
   Optional ByVal Style As AppWinStyle = AppWinStyle.MinimizedFocus, _ 
   Optional ByVal Wait As Boolean = False, _ 
   Optional ByVal Timeout As Integer = -1 _
) As Integer

Parametri

  • PathName
    Obbligatorio. String. Nome del programma da eseguire, accompagnato dalle opzioni della riga di comando e dagli argomenti obbligatori. PathName può includere anche l'unità e la cartella o il percorso della directory.

    Se non si conosce il percorso del programma, è possibile utilizzare il Metodo My.Computer.FileSystem.GetFiles per individuarlo. È possibile, ad esempio, chiamare My.Computer.FileSystem.GetFiles("C:\", True, "testFile.txt"), che restituisce il percorso completo di ogni file denominato testFile.txt in qualsiasi posizione dell'unità C:\.

  • Style
    Facoltativo. AppWinStyle. Valore scelto dall'Enumerazione AppWinStyle che specifica lo stile della finestra in cui verrà eseguito il programma. Se Style viene omesso, Shell utilizzerà AppWinStyle.MinimizedFocus, che avvia il programma ridotto a icona e nello stato attivo.

  • Wait
    Facoltativo. Boolean. Valore che specifica se è necessario che la funzione Shell attenda il completamento del programma. Se Wait viene omesso, Shell utilizzerà False.

  • Timeout
    Facoltativo. Integer. Numero di millisecondi di attesa del completamento se Wait è True. Se Timeout viene omesso, Shell utilizzerà -1 per indicare che non è previsto alcun timeout e che Shell non termina fino al completamento del programma. Se Timeout viene quindi omesso o impostato su -1, è possibile che Shell non restituisca mai il controllo al programma.

Eccezioni

Tipo di eccezione

Numero di errore

Condizione

ArgumentException

5

Style non rientra nell'intervallo compreso tra 0 e 9, estremi inclusi.

FileNotFoundException

53

Shell non è in grado di trovare il file PathName.

NullReferenceException

91

PathName è Nothing.

Se si esegue l'aggiornamento delle applicazioni Visual Basic 6.0 che utilizzano la gestione degli errori non strutturata, vedere la colonna "Numero di errore". È possibile confrontare il numero di errore con la Proprietà Number (oggetto Err). Se possibile, tuttavia, si consiglia di sostituire il controllo dell'errore con la procedura illustrata nella sezione Cenni preliminari sulla gestione strutturata delle eccezioni per Visual Basic.

Note

Il valore restituito della funzione Shell dipende dal fatto che il programma indicato nel parametro PathName sia in esecuzione o meno al termine della funzione Shell. Se Wait viene impostato su True e il programma termina prima della fine del timeout, Shell restituirà zero. Se il timeout scade o se Wait viene omesso oppure impostato su False, Shell restituirà l'ID di processo del programma. L'ID di processo è un numero univoco che identifica il programma in esecuzione.

Errore di avvio

Se la funzione Shell non è in grado di avviare il programma specificato, si verifica un errore FileNotFoundException. Può accadere, ad esempio, quando si tenta di eseguire un programma a 16 bit, quale command.com, da un'applicazione che utilizza lo spazio dei nomi System.Windows.Forms. Per risolvere il problema, è possibile eseguire un programma a 32 bit che chiami il programma a 16 bit desiderato. Nel caso di command.com, è possibile eseguire come alternativa cmd.exe.

Attesa di completamento

Per impostazione predefinita, la funzione Shell esegue il programma in modo asincrono. In altri termini, è possibile che il programma che viene avviato con la funzione Shell non termini se non vengono prima eseguite le istruzioni successive a Shell. Se si desidera attendere il completamento del programma prima di continuare, impostare Wait su True.

Determinazione del codice di uscita

Quando un processo termina, può restituire codice di uscita. Per recuperarlo, non è tuttavia possibile utilizzare Shell. La funzione Shell, infatti, restituisce zero se attende il completamento e il processo viene inoltre eseguito in un oggetto diverso da Shell.

Per recuperare il codice di uscita da un processo, è necessario scrivere del codice per avviare il processo e attenderne il completamento. Nell'esempio riportato di seguito viene illustrato come avviare un processo, attenderne il completamento e recuperarne il codice di uscita.

Dim procID As Integer
Dim newProc As Diagnostics.Process
newProc = Diagnostics.Process.Start("C:\WINDOWS\NOTEPAD.EXE")
procID = newProc.Id
newProc.WaitForExit()
Dim procEC As Integer = -1
If newProc.HasExited Then
    procEC = newProc.ExitCode
End If
MsgBox("Process with ID " & CStr(ProcID) & _
    " terminated with exit code " & CStr(procEC))

Protezione della specifica del file

È necessario racchiudere sempre tra virgolette l'intero percorso e la specifica del file, come illustrato nel seguente esempio.

ID = Shell("""C:\Program Files\display.exe"" -a -q", , True, 100000)

Ogni coppia di virgolette doppie adiacenti (" ") all'interno della stringa letterale viene interpretata come un'unica virgoletta doppia nella stringa. Nell'esempio precedente viene quindi passata alla funzione Shell la seguente stringa:

"C:\Program Files\display.exe" -a -q

Se il percorso non fosse stato racchiuso tra virgolette, sarebbe stata effettuata la ricerca del file Program.exe nella directory C:\, anziché del file display.exe nella directory C:\Programmi.

Nota sulla sicurezza:

Se il percorso e la specifica del file non vengono racchiusi tra virgolette, può verificarsi un problema di protezione se il nome del file o un nodo del percorso contiene spazi. Nell'esempio precedente il nodo del percorso \Program Files include uno spazio. Se la specifica non fosse stata racchiusa tra virgolette e un programma denominato Program.exe fosse stato installato in C:\ senza autorizzazione, sarebbe stato eseguito questo programma anziché display.exe.

Nota sulla sicurezza:

La funzione Shell richiede l'autorizzazione di accesso al codice non gestito, che può influenzarne l'esecuzione in situazioni di attendibilità parziale. Per ulteriori informazioni, vedere SecurityPermission e Permessi di accesso al codice.

Esempio

Nell'esempio riportato di seguito la funzione Shell viene utilizzata per eseguire un'applicazione specificata dall'utente. Se si specifica AppWinStyle.NormalFocus come secondo argomento, l'applicazione verrà aperta nel formato normale e con stato attivo.

Dim procID As Integer
' Run calculator.
procID = Shell("C:\Windows\system32\calc.exe", AppWinStyle.NormalFocus)
' The preceding path is for Windows XP.
' The Windows 2000 path is C:\WINNT\system32\calc.exe.

Note per gli sviluppatori di applicazioni per Smart Device

Questa funzione non è supportata.

Requisiti

Spazio dei nomi: Microsoft.VisualBasic

Modulo: Interaction

Assembly: Visual Basic Runtime Library (in Microsoft.VisualBasic.dll)

Vedere anche

Riferimenti

Enumerazione AppWinStyle

ArgumentException

FileNotFoundException

NullReferenceException

Metodo My.Computer.FileSystem.GetFiles

Funzione AppActivate