Wed 1 Mar 2006
Visual Basic 6 - Esperando a que termine la ejecución de un proceso
Posted by fragman under Utilidades[3] Comments
Pues 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




