Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/32: Рейтинг темы: голосов - 32, средняя оценка - 4.91
161 / 5 / 0
Регистрация: 26.07.2013
Сообщений: 22
1

Ждать до конца выполнения exe, открываемого из excel

29.07.2013, 11:07. Показов 6362. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста:
открываю EXE файл и хочу, чтобы следующее действие выполнялось после того, как EXE сам закроется
ждать заданное количество времени не получится, так как EXE может выполнятся сколько угодно времени

Visual Basic
1
2
3
4
5
MyPath = ThisWorkbook.Path
   Set WshShell = CreateObject("WScript.Shell")
   WshShell.CurrentDirectory = MyPath
   Call Shell("1.exe")
End Sub
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2013, 11:07
Ответы с готовыми решениями:

Размер и положение открываемого файла Excel
Как задать размер и положение окна открываемого файла Excel с помощью кода vb.NET? ...

Как дать команду ждать конца воспроизведения плеера
О Великие гуру программирования! помогите новичку! Необходимо, что бы программа ждала конца...

Как ждать выполнения определенной функции
Добрый вечер! Такая задача: Клиент-Сервер, передача файла по UDP (не ругайтесь, такое задание=)) ...

Для того, что бы смотреть видео онлайн без торможения, приходятся ждать, пока оно до конца загрузится
Такс. ну проблемы с виндой прошли как удалил прогу.... Только видео воспроизводилось нормально...

7
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,643
Записей в блоге: 13
29.07.2013, 12:06 2
Вот код модуля:
Visual Basic
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
'############### БЛОК ПРОГРАММ ОБЕСПЕЧЕНИЯ ПРОЦЕССОВ ###################
'###############   Позаимствовано у Брюса МакКинни   ###################
Const PROCESS_ALL_ACCESS = 2035711 '(&H1F0FFF)
Const INFINITE = -1                '(&HFFFFFFFF)
Const STILL_ACTIVE = 259           '(&H103)
Const WAIT_FAILED = -1             '(&HFFFFFFFF)
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
                                             ByVal bInheritHandle As Long, _
                                             ByVal dwProcessId As Long) As Long
Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
                                                     ByVal dwMilliseconds As Long) As Long
Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, _
                                                          lpExitCode As Long) As Long
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'::::   Ожидать завершения процесса и получить код завершения      :::::
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
Function WaitOnProgram(ByVal idProg As Long, _
              Optional ByVal WaitDead As Boolean) As Long
Dim cRead   As Long
Dim iExit   As Long
Dim hProg   As Long
Dim iResult As Long
    '::: Получаем хэндл процесса
    hProg = OpenProcess(PROCESS_ALL_ACCESS, False, idProg)
    If (WaitDead) Then
       '::: Ждем до победного конца
       iResult = WaitForSingleObject(hProg, INFINITE)
       '::: Если ожидание завершилось неудачно - возбудим ошибку
       If (iResult = WAIT_FAILED) Then Error Err.LastDllError
       '::: Получаем код завершения
       GetExitCodeProcess hProg, iExit
    Else
       '::: Пробуем получить код завершения
       GetExitCodeProcess hProg, iExit
       '::: Если процесс все еще в состоянии выполнения,
       '::: не дадим системе зависнуть
       Do While (iExit = STILL_ACTIVE)
          DoEvents
          GetExitCodeProcess hProg, iExit
       Loop
    End If
    '::: Закроем хендл
    CloseHandle hProg
    WaitOnProgram = iExit
End Function
 
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
'::::   Запустиь программу ProgName с командной строкой CmdLine,   ::::
'::::   получением кода завершения RC в окне стиля winStyle        ::::
'::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
Public Sub ExecPrg(ProgName As String, _
                   CmdLine As String, _
                   RC As long, _
                   winStyle As Integer)
Dim idProc As Long, iExit As Long
    idProg = Shell((ProgName + " " + CmdLine), winStyle)
    iExit = WaitOnProgram(idProg)
    RC = iExit
End Sub
Для запуска exe с ожиданием завершения, пишешь:

Visual Basic
1
      ExecPrg "Имя_exe","командная_строка",Rc&,Стиль_окна
2
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
29.07.2013, 12:18 3
Лучший ответ Сообщение было отмечено как решение

Решение

unknownopera, раз уж Вы задействовали в макросе объект WshShell, то используйте его и для решения этой задачи. Пример:
Visual Basic
1
2
3
4
Set WshShell = CreateObject("WScript.Shell")
WshShell.CurrentDirectory = MyPath
'Call Shell("1.exe")
RetCode = WshShell.Run("1.exe", 1, True)
3
161 / 5 / 0
Регистрация: 26.07.2013
Сообщений: 22
29.07.2013, 12:45  [ТС] 4
Dmitrii, Спасибо огромное, разобрался
0
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
03.11.2014, 02:31 5
Спасибо! И мне тоже пригодилось.

Добавлено через 5 часов 2 минуты
Попробовал этот пример еще и в VB6. Работает в оболочке VB, а вот в откомпилированном exe завершение процесса не ждет.
0
695 / 236 / 18
Регистрация: 17.01.2011
Сообщений: 583
Записей в блоге: 1
03.11.2014, 10:43 6
Код выложенный уважаемым Catstail, отлично работает в 32-х битном оффисе,, а вот в 64 битном не работает. Может у кого есть вариант аналогичной программы для 64-х битного оффиса ?
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,643
Записей в блоге: 13
03.11.2014, 11:03 7
Цитата Сообщение от Bagir Посмотреть сообщение
а вот в откомпилированном exe завершение процесса не ждет.
- мой код работает и в exe.
0
310 / 10 / 1
Регистрация: 09.10.2012
Сообщений: 52
03.11.2014, 12:00 8
Верно! Все отлично работает и в exe. Это я панку навел... Заморочка у меня вот в чем. Этот свой exe процесс я запускаю от имени другого пользователя. Этот танец с бубном мне нужен потому что у этого пользователя нужная звуковая карта выбрана основной. Увы, пока по другому я не сделал выбор звуковой карты для своей задачи. Так вот, если exe процесс запустить от имени другого пользователя, не работает никакой из найденных вариантов. Вообще конечно надо как то по другому решать проблему с картой, а не наморачиватья с пользователями.
0
03.11.2014, 12:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2014, 12:00
Помогаю со студенческими работами здесь

Как долго потоку с приоритетом 28 придется ждать своего выполнения после завершения операции ввода-вывода?
Предположим, что установлен размер кванта 20 мс и текущий поток (с приоритетом 24) только что...

Ожидание конца выполнения скрипта
Имеется класс, в котором есть функция, время выполнения какой - около 5 минут Как можно обойти...

Запрет на вызов функции до конца ее выполнения
Здравствуйте. Я новичок в программирование микроконтроллеров, не судите строго. Я написал...

Ожидания выполнения до конца или прогресс бар
Всем привет! Суть в том что при загрузке фотографий в БД , если закрыть окно - то фотографии...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru