Shell 函式
更新:2007 年 11 月
執行可執行程式,並於程式仍在執行時,傳回包含該程式之處理序 ID 的整數。
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
參數
PathName
必要項。String。要執行的程式名稱,以及任何必要的引數和命令列參數。PathName 也可包含磁碟機和目錄路徑或資料夾。如果不知道程式的路徑,則可使用 My.Computer.FileSystem.GetFiles 方法 來尋找它。例如,您可以 My.Computer.FileSystem.GetFiles("C:\", True, "testFile.txt"),這樣會傳回磁碟機 C:\ 上每個名為 testFile.txt 之檔案的完整路徑。
Style
選擇項。AppWinStyle。選自 AppWinStyle 列舉型別的值,指定程式要在其中執行的視窗樣式。如果略過 Style,則 Shell 會使用 AppWinStyle.MinimizedFocus,這會以最小化方式啟動程式並以其為焦點。Wait
選擇項。Boolean。指出 Shell 函式是否應該等待程式執行完畢的值。如果省略了 Wait,則 Shell 會使用 False。Timeout
選擇項。Integer。在 Wait 為 True 時,要等候完成的毫秒數。如果省略了 Timeout,則 Shell 會使用 -1,這表示沒有逾時,且除非程式完成,否則 Shell 不會傳回。因此,如果您省略了 Timeout 或將其設定為 -1,則有可能 Shell 永遠都不會傳回到程式中。
例外狀況
例外狀況類型 |
錯誤代碼 |
條件 |
---|---|---|
Style 不在 0 到 9 的範圍內 (含 0 和 9)。 |
||
Shell 找不到 PathName 檔案。 |
||
PathName 為 Nothing。 |
如果將使用非結構化錯誤處理的 Visual Basic 6.0 應用程式升級,請參閱「錯誤代碼」資料行 (您可以將錯誤代碼與 Number 屬性 (Err 物件) 比對)。但是,請盡可能考慮以 Visual Basic 的結構化例外處理概觀 取代這類錯誤控制項。
備註
Shell 函式的傳回值,是根據 Shell 傳回時,PathName 中的具名程式是否仍在執行而決定。如果將 Wait 設為 True 且程式在逾時之前完成,則 Shell 會傳回零。如果已經逾時、省略了 Wait 或將其設為 False,則 Shell 會傳回程式的處理序 ID。處理序 ID 是識別執行中程式的唯一數字。
無法啟動
如果 Shell 函式無法啟動具名程式,則會發生 FileNotFoundException 錯誤。例如,嘗試使用 System.Windows.Forms 從應用程式執行 16 位元的程式時 (例如 command.com),會發生此情況。解決方法是執行會呼叫所需之 16 位元程式的 32 位元程式。在 command.com 的情況下,您可以改為執行 cmd.exe。
等候完成
依預設,Shell 函式會非同步執行程式。這意味著由 Shell 函式啟動的程式,可能在緊接著 Shell 函式之後的陳述式 (Statement) 開始執行時,尚未結束該程式的執行狀態。如果要在繼續執行之前先等程式結束,請將 Wait 設定為 True。
判斷結束代碼
當處理序結束時,會傳回「結束代碼」(Exit Code)。不過,您無法使用 Shell 來擷取這個結束代碼,因為如果 Shell 會等待結束,則它將傳回零,另一個原因則是處理序是在與 Shell 不同的物件中執行。
若要擷取處理序中的結束代碼,則必須撰寫自己的程式碼,以啟始處理序並等待結束。下列範例會顯示如何啟始處理序、等待它結束,以及擷取它的結束代碼。
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))
保護檔案規格
應將完整路徑和檔案規格置於引號中,如同下列範例所示。
ID = Shell("""C:\Program Files\display.exe"" -a -q", , True, 100000)
字串常值內的每一組相鄰的雙引號 (" ") 都會解譯成字串中的一個雙引號字元。因此,前述範例對 Shell 函式展現如下的字串:
"C:\Program Files\display.exe" -a -q
如果路徑未包含在引號中,Windows 會在 C:\ 目錄中尋找名為 Program.exe 的檔案,而不是在 C:\Program Files 目錄中尋找 display.exe 檔案。
安全性注意事項: |
---|
如果未將路徑和檔案規格置於引號中,則當檔名或路徑節點包含空格時,即會有安全性的風險。在以上的範例中,路徑節點 \Program Files 包含一個空格。如果規格不在引號內,且名為 Program.exe 的程式已安裝至 C:\ (例如不當的更改),則 Windows 會執行該程式,而不是執行 display.exe。 |
安全性注意事項: |
---|
Shell 函式需要 Unmanaged 程式碼的使用權限,而該權限在部分信任的情況下,可能會影響其執行。如需詳細資訊,請參閱 SecurityPermission 和程式碼存取使用權限。 |
範例
下列範例會使用 Shell 函式,來執行使用者指定的應用程式。將 AppWinStyle.NormalFocus 指定為第二個引數將會以標準大小開啟應用程式,並為它提供焦點。
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.
智慧型裝置開發人員注意事項
不支援這個函式。
需求
命名空間 (Namespace)︰Microsoft.VisualBasic
**模組︰**Interaction
組件:Visual Basic Runtime Library (在 Microsoft.VisualBasic.dll 中)