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 可能永远不会将控制返回您的程序。

异常

异常类型

错误号

条件

ArgumentException

5

Style 不在 0 到 9(包含 0 和 9)范围内。

FileNotFoundException

53

Shell 找不到 PathName 文件。

NullReferenceException

91

PathName 为 Nothing。

如果正在升级使用非结构化错误处理方式的 Visual Basic 6.0 应用程序,请参见“错误号”一列。(您可以根据 Number 属性(Err 对象) 比较错误号。) 然而,如果可能,应当考虑用 Visual Basic 的结构化异常处理概述 替换这种错误控制。

备注

Shell 函数的返回值取决于 PathName 中指定的程序在 Shell 返回时是否仍在执行。如果将 Wait 设置为 True,并且程序在到达超时时间之前完成,则 Shell 返回零。如果超时过期或者省略 Wait 或将它设置为 False,则 Shell 返回程序的进程 ID。进程 ID 是标识正在运行的程序的唯一数字。

启动失败

如果 Shell 函数无法启动指定程序,则出现 FileNotFoundException 错误。例如,如果试图在使用 System.Windows.Forms 的应用程序中运行 16 位程序(如 command.com),则可能会出现这种情况。要解决这个问题,可以运行一个 32 位程序调用所需的 16 位程序。如果是 command.com,则可以将运行 cmd.exe 作为另一种选择。

等待完成

默认情况下,Shell 函数异步运行程序。这意味着用 Shell 函数启动的程序可能在 Shell 函数后面的语句执行完时还没有结束执行。如果想等待程序结束后再继续,请将 Wait 设置为 True。

确定退出代码

进程可以在终止时返回“退出代码”。但是,您不能使用 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 函数需要非托管代码权限,这可能会对它在部分信任情况下的执行产生影响。有关更多信息,请参见 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.

智能设备开发人员说明

不支持此函数。

要求

命名空间:Microsoft.VisualBasic

**模块:**Interaction

**程序集:**Visual Basic 运行库(在 Microsoft.VisualBasic.dll 中)

请参见

参考

AppWinStyle 枚举

ArgumentException

FileNotFoundException

NullReferenceException

My.Computer.FileSystem.GetFiles 方法

AppActivate 函数