Wed 1 Mar 2006
Visual Basic 6 - Esperando a que termine la ejecución de un proceso
Posted by fragman under UtilidadesPues nada, que el Visual Basic está muy bien para programar aplicaciones sencillas rápidamente, pero aparte de eso tiene un millón de carencias como por ejemplo no pararse a esperar a que termine la ejecución de un programa invocado externamente mediante la instrucción Shell :
Shell("gzip.exe backup.sql")
Mi intención era crear un programa q hiciese un backup SQL de una base de datos Access, lo comprimiese y lo enviase vía FTP a un servidor remoto. El problema es q con Visual Basic si lo mandas comprimir y utilizas una aplicación externa como gzip lo q sucede es q no se espera a q termine la compresión y ya está tratando de subirlo por FTP. La solución pasa por hacer una llamada al API de Windows:
'Declaraciones Windows API:
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
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
—
'Espera x milisegundos y devuelve el estado de ejecución de un proceso (si se omite el argumento espera hasta que finalice el proceso):
Function WaitForProcess(taskId As Long, Optional msecs As Long = -1) As Boolean
Dim procHandle As Long
'Obtiene el handler del proceso
procHandle = OpenProcess(&H100000, True, taskId)
'Verifica el estado del proceso y se lo devuelve a nuestra función
WaitForProcess = WaitForSingleObject(procHandle, msecs) <> -1
'Cierra el handler
CloseHandle procHandle
End Function
—
Utilización:
WaitForProcess Shell("gzip.exe backup.sql")
Espero q le sea útil a alguno
4 Responses to “Visual Basic 6 - Esperando a que termine la ejecución de un proceso”
Leave a Reply
You must be logged in to post a comment.
June 6th, 2006 at 8:37 am
PERFECT!
June 13th, 2006 at 11:34 pm
Tenia muchos meses de andar buscando esto hasta que gracias a Dios me tope con este sitio. Graciassssssssssssssssss.
Funciona muy bien.
June 30th, 2006 at 7:32 pm
Muy buen codigo, estuve intentado algo diferente:
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 Declare Sub Sleep Lib “kernel32″ (ByVal dwMilliseconds As Long)
Const STILL_ACTIVE = &H103 ‘ 259
Const PROCESS_QUERY_INFORMATION = &H400
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(CmdLine2, vbMinimizedNoFocus))
RetVal = 0
Do
GetExitCodeProcess hProcess, RetVal
DoEvents
Sleep 100
Loop While RetVal STATUS_PENDING
Pero no me funciono bien la funcion arroja valores que no estan documentados, cuando se somete a muchas iteraciones
September 2nd, 2009 at 6:43 am
Impresionante. Justo lo que necesitaba. Gracias por compartir.