He leído con detalle lo que he podido sobre el control de procesos y no hay manera de conseguir desviar la salida estándar...
Aquí tenéis un extracto de código de El Generador de Copias de Seguridad de MySQL que acabo de subir a este foro.
PRIVATE Proc AS Process
PRIVATE SUB Process_Read() 'este evento ocurre cuando el comando genera una salida, se supone
DIM cad AS String
LINE INPUT #Proc, cad
texto.text = cad & "\n" & texto.Text
END
PRIVATE SUB Process_Error(cad AS String) 'este evento ocurre cuando el comando genera un error, se supone
texto.text = cad & "\n" & texto.Text
END
PUBLIC PROCEDURE restaurar(Camino AS String, Copia AS String, OPTIONAL texto AS Object)
DIM anums AS NEW Integer[]
DIM anums2 AS NEW Integer[]
DIM n AS Integer
DIM pasadas AS Integer
DIM carpeta AS String
DIM elpath, scad AS String
comun.Colate = If(comun.Colate, comun.Colate, " /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish_ci */")
Copia = Camino &/ Copia
carpeta = Left(Copia, RInStr(copia, ".") - 1)
TRY MKDIR carpeta
texto.Text = ("Procesando copia \n")
WAIT 0.1
conDestino.conectar
texto.Text = ("Descomprimiendo copia \n") & texto.text
WAIT 0.1
elpath = Mid(Copia, 2, RInStr(Copia, "/") - 1)
IF Right(camino, 1) <> "/" THEN camino &= "/"
' SHELL "pax -rzvf " & Copia & " -s," & elpath & "," & camino & "," WAIT 'Esto funciona, y deja un rastro en la consola de gambas
Proc = SHELL "pax -rzvf " & Copia & " -s," & elpath & "," & camino & "," FOR READ 'Esto también funciona, pero no deja rastro en ningún sitio...
WHILE Proc.State = process.Running
WAIT 0.1 'Esto es un intento de ver en tiempo de ejecución que pasa... pero no veo na, claro
WEND
...
...
...
END
PRIVATE SUB Process_Read() 'este evento ocurre cuando el comando genera una salida, se supone
DIM cad AS String
LINE INPUT #Proc, cad
texto.text = cad & "\n" & texto.Text
END
PRIVATE SUB Process_Error(cad AS String) 'este evento ocurre cuando el comando genera un error, se supone
texto.text = cad & "\n" & texto.Text
END
PUBLIC PROCEDURE restaurar(Camino AS String, Copia AS String, OPTIONAL texto AS Object)
DIM anums AS NEW Integer[]
DIM anums2 AS NEW Integer[]
DIM n AS Integer
DIM pasadas AS Integer
DIM carpeta AS String
DIM elpath, scad AS String
comun.Colate = If(comun.Colate, comun.Colate, " /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish_ci */")
Copia = Camino &/ Copia
carpeta = Left(Copia, RInStr(copia, ".") - 1)
TRY MKDIR carpeta
texto.Text = ("Procesando copia \n")
WAIT 0.1
conDestino.conectar
texto.Text = ("Descomprimiendo copia \n") & texto.text
WAIT 0.1
elpath = Mid(Copia, 2, RInStr(Copia, "/") - 1)
IF Right(camino, 1) <> "/" THEN camino &= "/"
' SHELL "pax -rzvf " & Copia & " -s," & elpath & "," & camino & "," WAIT 'Esto funciona, y deja un rastro en la consola de gambas
Proc = SHELL "pax -rzvf " & Copia & " -s," & elpath & "," & camino & "," FOR READ 'Esto también funciona, pero no deja rastro en ningún sitio...
WHILE Proc.State = process.Running
WAIT 0.1 'Esto es un intento de ver en tiempo de ejecución que pasa... pero no veo na, claro
WEND
...
...
...
END
¿Alguien puede orientarme de por qué la llamada a SHELL (o EXEC, que las dos cosas he probado) no levanta el evento Process_Read?