Консультация № 90855
10.06.2007, 19:06
0.00 руб.
0 5 5
Здравствуйте!

Помогите, надо чтоб программа запускала несколько ехе-шников поочередно (один за другим, а не все одновременно)... а потом закрывалась

Пробовал так как в примере (см. ниже) но получается, что они все вместе запускаются.... а надо друг за другом...

Прошу ответить побыстрее, мой проэкт из-за этого тормозится

Заранее спасибо!!!!!!

Приложение:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Shell("Setup1.exe", AppWinStyle.NormalFocus) Shell("Setup2.exe", AppWinStyle.NormalFocus) Shell("Setup3.exe", AppWinStyle.NormalFocus) End End Sub

Обсуждение

Неизвестный
10.06.2007, 20:16
общий
это ответ
Здравствуйте, Молчанов Евгений!
Попробуйте так как в приложении. Недостаток - очень плохое управление прогами

Приложение:
Dim exe1 As String, exe2 As String, exe3 As StringPrivate Sub openexe(exe1 As String, exe2 As String, exe3 As String)‘Процедура использует командную строку‘Каждая новая программа открывается после успешного завершения каждой програмыShell ("cmd /c " & exe1 & " && cmd /c " & exe2 & " && cmd /c " & exe3)‘в качестве параметров подставляйте путь к нужным програмам.End Sub
Неизвестный
11.06.2007, 00:25
общий
это ответ
Здравствуйте, Молчанов Евгений!
Судя по листингу команду "на запуск" программы действителоно получают "поочередно". Проблема в том, что Ваша программа не ждет завершения выполнения команды и выполняет следующую.
Для решения необходимо организовать задержку:
получением от открывающейся кода открытия,
или запуском таймера
или просто обработкой циклов ....
И Ваш "проэкт" перестанет тормозится :).
Евгений.
Неизвестный
11.06.2007, 00:31
общий
это ответ
Здравствуйте, Молчанов Евгений!
А зачем писать именно на VB.
Гораздо проще же написать командный файл (bat или cmd). А в нём уже команды запуска ехе-шников, и они будут выполняться поочерёдно. После он сам и закроется, имеется ввиду командный файл.
Если необходимо именно на VB, то придётся искать пути проверки окончания работы 1-й программы, потом второй и т.д., например, при помощи Win API.
Или как вариант написать cmd файл и запускать его из своей программы.
Shell("C:\Temp\111.cmd", AppWinStyle.Hide) ‘где 111.cmd Ваш командный файл
Application.Exit() ‘не забыть добавить, чтобы Ваше приложение закрылось.
В командном файле пишем
"Path\Setup1.exe"
"Path\Setup2.exe"
"Path\Setup3.exe"
где Path путь к файлам.
Хотелось бы также внести некоторое уточнение к ответу Ualife.
У меня стоит Vista Home Premium, и строка Shell ("cmd /c " & exe1 & " && cmd /c " & exe2 & " && cmd /c " & exe3) не работает, а работает мой вариант.
Неизвестный
11.06.2007, 02:52
общий
это ответ
Здравствуйте, Молчанов Евгений!
Для "замораживания" программы на время выполнения другой воспользуйтесь функциями API.
В приложении функция SynchronizeShell, вызывая которую вместо Shell, Вы получете необходимый эффект.

Приложение:
‘расположите в модулеOption ExplicitPublic Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As LongPublic Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As LongPublic Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Const SYNCHRONIZE = &H100000Public Const INFINITE = &HFFFFPublic Sub SynchronizeShell(PathName As String, Optional WindowStyle As VbAppWinStyle = vbMinimizedFocus) Dim PID As Long Dim phnd As Long PID = Shell(PathName, WindowStyle)‘запускаем приложение и получаем его идентификационный номер If PID = 0 Then Exit Sub‘ если ошибка, то выходим phnd = OpenProcess(SYNCHRONIZE, 0, PID)‘открываем манипулятор процесса WaitForSingleObject phnd, INFINITE‘приостанавливаем выполнение программы CloseHandle phnd‘закрываем манипуляторEnd Sub
Неизвестный
14.06.2007, 06:42
общий
это ответ
Здравствуйте, Молчанов Евгений!
Насколько я понял у Вас VB.NET, так вот аргументы Shell для .NET:

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

видите? третий параметр Wait, он показывает нужно ли ждать завершения программы, а четвертый параметр TimeOut - указывает сколько времени ждать, если -1(по умолчанию) то управление в программу может и не вернутся никогда.
просто поставьте третьим параметром True:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Shell("Setup1.exe", AppWinStyle.NormalFocus, True)
Shell("Setup2.exe", AppWinStyle.NormalFocus, True)
Shell("Setup3.exe", AppWinStyle.NormalFocus, True)
End
End Sub
Успехов.
Форма ответа