Ожидание завершения SHELL

Программирование на Visual Basic for Applications
Pavelkq
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 05.07.2003 (Сб) 11:21

Ожидание завершения SHELL

Сообщение Pavelkq » 05.07.2003 (Сб) 11:29

Пишу мульку в ворде: разархивировать файл из списка (shell "cmd /c pkunzip -e....") и открыть его. Но разархивация происходит долго, а VBA не ждет завершения. Как преодолеть проблему? Тупую задержку ставить беспонтово.
Видел эту тему в обычном VB, но как ее адаптировать в подпрограмму VBA и чтоб небольшая вышла?

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Re: Ожидание завершения SHELL

Сообщение SergeySV » 09.07.2003 (Ср) 11:13

Pavelkq писал(а):Пишу мульку в ворде: разархивировать файл из списка (shell "cmd /c pkunzip -e....") и открыть его. Но разархивация происходит долго, а VBA не ждет завершения. Как преодолеть проблему? Тупую задержку ставить беспонтово.
Видел эту тему в обычном VB, но как ее адаптировать в подпрограмму VBA и чтоб небольшая вышла?


подпрограмму VBA - это типа макрос что-ли...?

А вообще можно так сделать:
Код: Выделить всё
Private Const INFINITE = &HFFFF
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject As Long) As Long

Dim i As Long, ProcessID As Long, hProcess As Long

   ProcessID = Shell "cmd /c pkunzip -e...."
   hProcess = OpenProcess(&H100000, True, ProcessID)
   ' INFINITE - ждать завершения процеса
   ' или можно вместо INFINITE указать время задержки в милисек.
   i = WaitForSingleObject(pHandle, INFINITE)



А можно и вообще только отдной API функцией ограничиться, заменить WaitForSingleObject циклом с DoEvents:
Код: Выделить всё
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject As Long) As Long

Dim ProcessID As Long, hProcess As Long

   ProcessID = Shell "cmd /c pkunzip -e...."
   hProcess = OpenProcess(&H100000, True, ProcessID)
   Do while hProcess <> NULL
     hProcess = OpenProcess(&H100000, True, ProcessID)
     DoEvents
   Loop
Главное двигаться не быстрее, чем думает твоя голова.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 71

    TopList  
cron