powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как запустить другое приложение и дождаться его завершения?
19 сообщений из 19, страница 1 из 1
Как запустить другое приложение и дождаться его завершения?
    #36989467
32sasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как запустить другое приложение (к примеру IE) и приостановить выполнение программы дожидаясь завершения запущенного приложения?

К примеру запускаем нашу прогу MY.exe, она открывает IE c адресом google.com делаем что нам необходимо, закрываем IE. После закрытия my.exe открывает к примеру блокнот.
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36989512
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
Option Explicit

'*******************************
' Type Definition for ExecCmd
'*******************************
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, lpProcessInformation As _
PROCESS_INFORMATION) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject As Long) As Long

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = - 1 &



Public Sub ExecuteAndWait(cmdline$)
Dim proc As PROCESS_INFORMATION
Dim START As STARTUPINFO
Dim ret As Long

' Initialize the STARTUPINFO structure:
START.cb = Len(START)

' Start the shelled application:
ret = CreateProcessA( 0 &, cmdline$,  0 &,  0 &,  1 &, _
NORMAL_PRIORITY_CLASS,  0 &,  0 &, START, proc)
If ret Then
' Wait for the shelled application to finish:
ret = WaitForSingleObject(proc.hProcess, INFINITE)
End If
CloseHandle (proc.hProcess)
End Sub


Private Sub Form_Load()

Call ExecuteAndWait("Notepad.exe")
MsgBox "Notepad is closed"

End Sub
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36990192
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Э,....я по жизни использую другую функцию:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Sub ShellAndContinue(ByVal AppToRun As String, mode As VbAppWinStyle)
   ' On Error GoTo ErrorRoutineErr
    
    Dim hProcess As Long
    Dim retVal As Long
    Dim Msg, Style, title, Response 'msgbox variables
    
    'The next line launches AppToRun,
    'captures process ID
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,  1 , _
    Shell(AppToRun, mode))
    Do
        'Get the status of the process
        GetExitCodeProcess hProcess, retVal
        DoEvents
    'Loop while the process is active
    Loop While retVal = STILL_ACTIVE
    
ErrorRoutineResume:
    Exit Sub
'ErrorRoutineErr:
'    MsgBox Error.Description
End Sub

Что мне в ней последнее время перестало нравиться (типа стал обращать внимание на такие "мелочи"): пока она работает, грузит процессор на 50%.

Что не понравилось в вашей. Как-то странно она работает. Ощущение, что подтормаживает при старте. И очень плохое ощущение из-за песочных часиков кот. достают, эдакий вирус за кадром чегой-то делает. Но процессор практически не грузит.

Т.е. визуально "моя" мне нравится больше. Но 50% мне последнее время оч. не нравится, т.к. использую свою в серьезной проге где ресурсов много нужно совсем не на эти игрушки.

Как быть?
Скорее всего DoEvents=>50%, но чем заменить. Заменить по ходу можно простым VB-таймером,
но надо бы чтоб это была ф-ция а не чудо-конструкция. М.б. можно таймер на ходу создать внутри ф-ции, но как быть с его Timer_Timer.
Всякие API-Sleep использовать панически боюсь, т.к. эффект для всей системы может быть непредсказуем (проверено, больше не хочу)...
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36990218
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Всякие API-Sleep использовать панически боюсь, т.к. эффект для всей системы может быть непредсказуем (проверено, больше не хочу)...
А SetTimer/KillTimer тоже к ним относится?
В теме про дропдаун такая конструкция активно используется, тьфу-тьфу, вроде работает...
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36990282
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА SetTimer/KillTimer тоже к ним относится?
Ну это код как минимум видеть надо.
По поводу Sleep: у меня инсталлер запускает сишное приложение. Это сишное приложение устанавливает драйвера устройств и отслеживает конец этой установки, чтоб не двигаться дальше раньше времени. А т.к. установка драйверов это plug and play, личное дело OS, то приложение это очевидно не умеет отловить конец установки напрямую и видимо само использует ф-ции подобные описанным выше. Если предварительно запустить в VB Sleep, то вышеуказанное C-шное приложение будет сбито с толку и выйдет раньше, чем драйвера установятся. Ничего при этом не сломается, но гармония будет слегка нарушена. Поэтому Sleep-ов нам не надо. Sleep это достаточно опасная игра с OS и на сайте Microsoft в описании Sleep есть об этом предупреждение.
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36990288
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Некоторым плагиатом (накатал как говорится на скору руку), кот. можно с осторожностью использовать, будет следующая комбинация:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Dim m_process As Long

Sub ShellAndContinue2(ByVal AppToRun As String, mode As VbAppWinStyle)
    'The next line launches AppToRun,
    'captures process ID
    m_process = OpenProcess(PROCESS_QUERY_INFORMATION,  1 , _
    Shell(AppToRun, mode))
    Timer1.Interval =  10 
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    Dim retVal As Long
    'Get the status of the process
    GetExitCodeProcess m_process, retVal
    If (Not (retVal = STILL_ACTIVE)) Then
        Timer1.Enabled = False
        m_process =  0 
        MsgBox "Application closed!"
    End If
End Sub
Но, как сами понимаете, на полноту и универсальность это не претендует. По крайней мере я выкинул злобное DoEvents().
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36990292
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Shocker.ProА SetTimer/KillTimer тоже к ним относится?
Ну это код как минимум видеть надо.
вот тут 9467398 , если интересно
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36990324
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

как то все там хитро и наворочено, но ощущения подсказывают что будет что-то типа окультуренного варианта, что я привел чуть выше, не претендующего однако на общность, что дают ShellAndContinue или ExecuteAndWait, т.е. стартовать-ждать-продолжить. Может я чего-нибудь не понял, но тогда надо вникать-разжевываться.
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36990741
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Konst_One
> CloseHandle (proc.hProcess)


Здесь ещё нужно закрывать хендл тренда
Код: plaintext
CloseHandle (proc.hThread)
. Недавно сталкивался, у товарища идет
обработка множества файлов в режиме 24/7 и отдельным процессом запускаелся архиватор, по прошествии какого-то
времени(порядка дня) у системы заканчивались ресурсы. когда выгружал свою программу, ресурсы сразу освобождались. Т.е.
раз в день приходилось перезапускать программу. В результате выяснилось что не закрывался хендл рабочего потока.


> Автор: Дмитрий77
> Т.е. визуально "моя" мне нравится больше. Но 50% мне последнее время оч. не нравится, т.к. использую свою в
> серьезной проге где ресурсов много нужно совсем не на эти игрушки.

У Кости "идеологически" правильная функция и правильней пользоватся ей.
+ в том, что
- стартонуть новый процесс можно под другой учетной записью,
- переназначить StdIn, StdOut, StdErr и ловить вывод работы и что-то подавать на вход запускаемой программы. т.е.
организовать интерактивность :)

Хотя в свою, ты можешь поставить вместо цикла ожидания функцию ожиданя освобождения хендла:
Код: plaintext
1.
2.
3.
' Wait for the shelled application to finish:
ret = WaitForSingleObject(hProcess, INFINITE)
' Не забывай закрывать все что открываешь :)
CloseHandle (hProcess)

> Что не понравилось в вашей. Как-то странно она работает. Ощущение, что подтормаживает при старте. И очень плохое
> ощущение из-за песочных часиков кот. достают, эдакий вирус за кадром чегой-то делает. Но процессор практически не
> грузит.

В твоей функции вызов CreateProcessA закамуфлирован вызовом Shell. Возможно там есть какая-то оптимизация, которая
позволяет быстрее отрабатывать. :)

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36990860
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносХотя в свою, ты можешь поставить вместо цикла ожидания функцию ожиданя освобождения хендла:Вчера еще пробовал,не работает. Попробовал сейчас еще раз:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Sub ShellAndContinue3(ByVal AppToRun As String, mode As VbAppWinStyle)
    Dim hProcess As Long
    Dim retVal As Long
    'The next line launches AppToRun,
    'captures process ID
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,  1 , Shell(AppToRun, mode))
    retVal = WaitForSingleObject(hProcess, INFINITE)
    CloseHandle (hProcess)
End Sub
Private Sub Command1_Click()
   ShellAndContinue3 "Notepad.exe", vbNormalFocus
   MsgBox "Notepad is closed"
End Sub
Msgbox вылезает сразу, как запускается блокнот. Где подвох?
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36990913
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> Msgbox вылезает сразу, как запускается блокнот. Где подвох?


Подвох в том, что гранаты у тебя не той
конструкции :)
Попробуй так:
Код: plaintext
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION >>or SYNCHRONIZE<<,  1 , Shell(AppToRun, mode))


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36991113
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносПопробуй так:
Код: plaintext
   hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or SYNCHRONIZE,  1 , Shell(AppToRun, mode))
Так работает, но поведение очень сходно с примером приведенным Konst_One. Т.е. приложение вызвавшее эту функцию "завешивается". Если Form с Command1 не делать невидимой, то до окончания процесса она невменяемая.
Видимо от этого всякие "песочные часики", но это надо проверять в контексте.
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36991247
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INFINITE как раз и означает ждать до завершения. а то , что вы хотите , это совсем другое и называется запуск в фоновом режиме, вам надо копать в сторону отлова событий завершения чужого процесса, но смысла во всём этом я вообще не вижу.
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36991448
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

Смысл некоторый есть, т.к. я это частенько использую для запуска системных процессов, которые надо подождать (напр. запуск/остановка службы, запуск командного приложения, в инсталляторе). Если использовать ваш метод WaitForSingleObject, то в нек. частных случаях он м.б. и сойдет с нек.оговорками типа песочных часиков, но в более критических приложение просто станет и все... Мой "родной" ShellAndContinue как раз более устойчив в этом плане, загрузка процессора от DoEvents 50%(не 100 потому что Dual) на самом деле липовая ==бездействие системы. Но тем не менее сие может пугать умного (но не очень) юзера коих большинство и что хуже может (как вычитал) приводить к сбоям в "спецфункциях" компьютера, типа контроль температуры процессора и всякая прочая лабуда. кот. эти самые умные (но не очень) юзеры типа ценят.
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #36991548
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77


Тогда может имеет смысл посмотреть на такой подход?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как запустить другое приложение и дождаться его завершения?
    #38124186
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,уважаемые форумчане!

Хочу поднять еще раз эту тему вот в каком аспекте: Функция отслеживания замечательная, но вот у меня никак не получается задать параметр START.wShowWindow, чтобы не появлялось окна запускаемой программы. Вот что делаю:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
Option Explicit

'*******************************
' Type Definition for ExecCmd
'*******************************
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _
hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CreateProcessA Lib "kernel32" (ByVal _
lpApplicationName As Long, ByVal lpCommandLine As String, ByVal _
lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _
ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _
ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, _
lpStartupInfo As STARTUPINFO, lpProcessInformation As _
PROCESS_INFORMATION) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal _
hObject As Long) As Long

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const INFINITE = -1&

Private Const SW_HIDE = 0
Private Const SW_SHOWNORMAL = 1
Private Const SW_NORMAL = 1
Private Const SW_SHOWMINIMIZED = 2
Private Const SW_SHOWMAXIMIZED = 3
Private Const SW_MAXIMIZE = 3
Private Const SW_SHOWNOACTIVATE = 4
Private Const SW_SHOW = 5
Private Const SW_MINIMIZE = 6
Private Const SW_SHOWMINNOACTIVE = 7
Private Const SW_SHOWNA = 8
Private Const SW_RESTORE = 9
Private Const SW_SHOWDEFAULT = 10
Private Const SW_MAX = 10



Public Sub ExecuteAndWait(cmdline$)
Dim proc As PROCESS_INFORMATION
Dim START As STARTUPINFO
Dim ret As Long

' Initialize the STARTUPINFO structure:
START.cb = Len(START)
START.wShowWindow=0

' Start the shelled application:
ret = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _
NORMAL_PRIORITY_CLASS, 0&, 0&, START, proc)
If ret Then
' Wait for the shelled application to finish:
ret = WaitForSingleObject(proc.hProcess, INFINITE)
End If
CloseHandle (proc.hProcess)
End Sub


Private Sub Form_Load()

Call ExecuteAndWait("cmd /c ....")

End Sub



Подскажите в чем моя ошибка?
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #38124189
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_men,

а кажется понял не указал dwFlags. Пошел читать дальше про определение этого параметра
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #38124192
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_men,

Извините за беспокойство вопрос снят.
...
Рейтинг: 0 / 0
Как запустить другое приложение и дождаться его завершения?
    #38127303
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
32sashaКак запустить другое приложение (к примеру IE) и приостановить выполнение программы дожидаясь завершения запущенного приложения?

К примеру запускаем нашу прогу MY.exe, она открывает IE c адресом google.com делаем что нам необходимо, закрываем IE. После закрытия my.exe открывает к примеру блокнот.Простой вариант
Код: vbnet
1.
2.
3.
4.
5.
6.
With CreateObject("wscript.shell")
    .Run "iexplore.exe google.com", , True
    MsgBox "теперь блокнот"
    .Run "notepad.exe", , True
    MsgBox "продолжение программы"
End With
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как запустить другое приложение и дождаться его завершения?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]