Ejecutar un programa con Shell y esperar a que termine en Visual Basic
Visual Basic 3 agosto 2008
Esta rutina se utiliza para lanzar una aplicación desde el Shell visual basic y esperar a que la aplicación lanzada termine para continuar con la ejecución.
Para ello se utiliza la función API OpenProcess para identificar el proceso que se ha lanzado con el Shell y se espera hasta que el proceso termine para continuar la ejecución.
En un módulo creamos el siguiente código para poder utilizar las funciones de la API:
-
Option Explicit
-
Private Declare Function OpenProcess Lib "kernel32" _
-
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
-
ByVal dwProcessId As Long) As Long
-
Private Declare Function GetExitCodeProcess Lib "kernel32" _
-
(ByVal hProcess As Long, lpExitCode As Long) As Long
-
Private Const STATUS_PENDING = &H103&
-
Private Const PROCESS_QUERY_INFORMATION = &H400
Luego en el mismo módulo creamos la función:
-
Public Function ShellandWait(ExeFullPath As String, _
-
Optional TimeOutValue As Long = 0) As Boolean
-
Dim lInst As Long
-
Dim lStart As Long
-
Dim lTimeToQuit As Long
-
Dim sExeName As String
-
Dim lProcessId As Long
-
Dim lExitCode As Long
-
Dim bPastMidnight As Boolean
-
On Error GoTo ErrorHandler
-
lStart = CLng(Timer)
-
sExeName = ExeFullPath
-
'Deal with timeout being reset at Midnight
-
If TimeOutValue> 0 Then
-
If lStart + TimeOutValue <86400 Then
-
lTimeToQuit = lStart + TimeOutValue
-
Else
-
lTimeToQuit = (lStart - 86400) + TimeOutValue
-
bPastMidnight = True
-
End If
-
End If
-
lInst = Shell(sExeName, vbMinimizedNoFocus)
-
lProcessId = OpenProcess(PROCESS_QUERY_INFORMATION, False, lInst) 'Optenemos el ProcessID
-
Do 'Aqui se genera un ciclo hasta que el proceso sea distinto de pendiente, o sea, Alla terminado.
-
Call GetExitCodeProcess(lProcessId, lExitCode) ' Optenemos el si hay exits code o todavia esta en ejecucion (pending)
-
DoEvents
-
If TimeOutValue And Timer> lTimeToQuit Then
-
If bPastMidnight Then
-
If Timer <lStart Then Exit Do
-
Else
-
Exit Do ' Se sale del ciclo si se acavo el tiemo de espera
-
End If
-
End If
-
Loop While lExitCode = STATUS_PENDING
-
ShellandWait = True
-
ErrorHandler:
-
ShellandWait = False
-
Exit Function
-
End Function
Y luego llamar a la función. La podemos llamar de dos formas, con el valor opcional o sin el:
ShellandWait (text1.text,0) - espera infinitamente hasta que termine el proceso.
ShellandWait (text1.text,10000) - espera 10 seg. o el termino del proceso para salir.
-
Private Sub Command1_Click()
-
Dim retval As Variant
-
retval = ShellandWait(Text1.Text)
-
MsgBox "HOLA"
-
End Sub
Descarga un ejemplo desde aquí.
Vota este artículo:
Posts anterior y posterior:
Posts Relacionados:
- Previo: « Reduce de tamaño tus jpg con Visual Basic.
- Siguiente: Desproteger hoja de Excel con contraseña. »


enero 11th, 2010 a las 7:21 pm
GENIAL. Me has sacado de un apuro. Muchas gracias.
junio 7th, 2010 a las 8:18 pm
gracias por el aporte, me fue util.
tube que hacerle una modificacion, por lo que creo qeu es un error. El "exit function" deberia ir antes de la etiqueta, para que si el comando se ejecuto correctamente salga con true, porque sino siempre sale en falso
quedaria asi:
ShellandWait = True
Exit Function'<--nueva posicion del exit
ErrorHandler:
ShellandWait = False
'Exit Function <--aca no tiene sentido pues luego de esto esta el "end function"
End Function
diciembre 27th, 2010 a las 10:48 pm
Excelente !!! me ayudo MIL gracias por tu aporte