Visual Basic - Saber cuando termina un comando en la shell

Life is soft - evento anual de software empresarial
 
Vista:

Saber cuando termina un comando en la shell

Publicado por Fer (3 intervenciones) el 01/01/2005 18:21:33
Buenas a todos y feliz 2005

Estoy desarrollando una gui para un programa ms-dos, esta gui lo que hace en cierto momento es ejecutar un comando en la shell y así llamar al otro programa, a través de este codigo:

Shell ("otroprograma.exe ")

Mi duda es cómo saber cuándo acaba de ejecutarse, para poder mostrar un aviso en un msgbox. Ahora lo hace todo bien, se abre la ventana de ms-dos, se ejecuta el programa y cuando acaba se cierra, pero me gustaría que al momento de cerrarse, mostrara un aviso.

Gracias y un saludo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Saber cuando termina un comando en la shell

Publicado por Cecilia Colalongo (3116 intervenciones) el 01/01/2005 21:08:34
Fijate con ésto:

Declare Function OpenProcess Lib "Kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long

Declare Function GetExitCodeProcess Lib "Kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long

Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long)
Public Sub ExecCmdNoFocus(ByVal CmdLine As String)
Dim hProcess As Long
Dim RetVal As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(CmdLine, vbHide))
Do
GetExitCodeProcess hProcess, RetVal
DoEvents
Sleep 100
Loop While RetVal = STILL_ACTIVE
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Saber cuando termina un comando en la shell

Publicado por Fer (3 intervenciones) el 02/01/2005 21:25:40
Buenas de nuevo... y gracias por la molestia

He probado tu código y funciona, pero no consigo que me salga el Msgbox cuando termina. A tu código le he añadido un private delante de cada declaración del principio porque si no daba error. Luego el resto está tal cual. He sustituido la parte de mi programa donde hacía la llamada a la shell por esto:

ExecCmdNoFocus ("otroprograma.exe")
MsgBox ("Fin del comando")

El resultado es que se ejecuta bien, no sale la ventana de ms-dos, pero el MsgBox se lo come y no lo ejecuta. No sé si lo habré puesto mal... He probado a cambiar el MsgBox de sitio, y el resultado es que si lo pongo antes de la linea "hProcess = OpenProcess(...)" sí sale, pero eso es antes de ejecutar el comando, y si lo pongo después de esa linea ya no sale.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Saber cuando termina un comando en la shell

Publicado por Benjo (679 intervenciones) el 03/01/2005 05:59:18
Fer
Descarto que has declarado las constantes necesarias para GetExitCodeProcess y OpenProcess.

Ejecuté el código que envió Cecilia, y tanto en Win 98 como en XP funcionó perfectamente, el Msgbox se ejecuta en cualquier sentencia posterior a "Loop While RetVal = STILL_ACTIVE"

Si persiste el error que mencionás, Verificá los valores de las constantes que aquí te envio.

Const STILL_ACTIVE = &H103
Const PROCESS_QUERY_INFORMATION = &H400

Mucha Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Saber cuando termina un comando en la shell

Publicado por Fer (3 intervenciones) el 03/01/2005 15:07:13
Me faltaba lo de las constantes, ya lo añadí y funciona perfectamente
Gracias y un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Saber cuando termina un comando en la shell

Publicado por marco (3 intervenciones) el 31/08/2005 23:39:33
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
Const PROCESS_QUERY_INFORMATION = &H400

Sub CAllShell32(ByVal JobToDo As String)
Dim hProcess As Long
Dim RetVal As Long
'Captura el processID
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(JobToDo, 1))

Do

'Toma el estado del poceso
GetExitCodeProcess hProcess, RetVal

DoEvents: Sleep 100

'Vuelve al ciclo si el proceso está activo
Loop While RetVal = STILL_ACTIVE
MsgBox "se cerró la aplicación"

End Sub

Private Sub Command1_Click()
CAllShell32 Text1.Text
End Sub

'Colocá en tu Form un textBox con la propiedad .text = "calc.exe"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar