Функция Shell
Обновлен: Ноябрь 2007
Запускает исполняемую программу и возвращает целочисленное значение, содержащее идентификатор процесса программы, если она все еще выполняется.
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"), которая возвращает полный путь каждого файла с именем testFile.txt в любом месте на диске C:\.
Style
Необязательный атрибут. AppWinStyle. Значение, выбранное из перечисления Перечисление AppWinStyle и задающее стиль окна, в котором запускается программа. Если опущен Style, Shell использует AppWinStyle.MinimizedFocus, которая запускает программу в свернутом состоянии и в фокусе.Wait
Необязательный атрибут. Boolean. Значение, показывающее, должна ли функция Shell ожидать завершения программы. Если этот аргумент Wait опущен, используется ShellFalse.Timeout
Необязательный атрибут. Integer. Число миллисекунд ожидания завершения, если значение Wait равно True. Если параметр Timeout опущен, Shell использует -1, то есть тайм-аут не используется и Shell ожидает завершения выполнения программы. Таким образом, если вы опустите Timeout или установите его в -1, существует возможность, что Shell никогда не передаст управления вашей программе.
Исключения
Тип исключения |
Номер ошибки |
Условия |
---|---|---|
Style вне диапазона от 0 до 9 включительно. |
||
Shell не удается найти файл PathName. |
||
Значение параметра PathName составляет Nothing. |
См. столбец "Номер ошибки", если выполняется обновление приложений Visual Basic 6.0, в которых используется неструктурированная обработка ошибок. (Можно сравнить номер ошибки с Свойство Number (объект Err).) Однако по возможности следует заменять такую систему управления ошибками на Обзор структурной обработки исключений в Visual Basic.
Заметки
Значение, возвращаемое Shell, зависит от того, находится ли программа, указанная в PathName, до сих пор в процессе выполнения (на момент возврата Shell). Если вы установите Wait в True и программа завершится до окончания тайм-аута, Shell возвращает ноль. Если тайм-аут истекает или вы опускаете Wait или установили его в значение в False, Shell возвращает идентификатор процесса программы. Идентификатором процесса называется уникальный номер, определяющий запущенную программу.
Не удалось запустить
Если функции Shell не удается запустить именованную программу, возникает ошибка FileNotFoundException. Это может произойти, например, при попытке запустить 16-разрядную программу, такую как command.com, из приложения, используя System.Windows.Forms. Для обработки подобной ситуации можно запустить 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 ищет файл с именем Program.exe в каталоге C:\ вместо display.exe в каталоге C:\Program Files.
Примечание о безопасности. |
---|
Если вы не заключаете путь и имя файла в кавычки, существует проблема в безопасности в случае, если имя файла или каталога содержит пробелы. В предыдущем примере путь узла \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)