FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Hola a todos.
Estoy buscando algo para poder capturar las salidas por vía standard de programas que son llamados desde Delphi utilizando WinExec() o cualquier otra cosa equivalente. Un ejemplo simple de lo que busco es ejecutar WinExec('DIR',0) y que el resultado (listado del contenido del directorio actual), lo pueda mostrar dentro de un TMemo. A poder ser me gustaría tener que prescindir de cosas como WinExec('DIR > resultado.txt', 0), porque obviamente lo necesito para cosas bastante más complejas que ejecutar un simple DIR. He leido este hilo y me ha llamado la atención lo de la utilización de Pipes. Quizá lo he entendido mal. Pero me ha parecido entender que con pipes se conseguiría lo que busco, y además también enviar comandos a aplicaciones. ¿Podría alguien explicarme en qué consiste lo de las Pipes y cómo poder hacerlo yo también? La solución que aportó droguerman..., ¿está basada en Pipes? La solución que encontró Rolando Glez..., ¿está basada en la droguerman..., o son dos soluciones distintas que no tienen nada que ver? ¿Se pueden establecer pipes a aplicaciones ubicadas en otros PC (acceso remoto)? Muchas gracias. |
#2
|
|||
|
|||
Funsiones Principales para abordar PIPES (redirecionamiento)
Aqui les mando las funsiones principales parea abordar esta tecnica de PIPES espero que le sea util
//Las variables Código:
type Tbuffer=array[1..4096] of char; var pi: PROCESS_INFORMATION; sd: SECURITY_DESCRIPTOR; si: TSTARTUPINFO; sa: SECURITY_ATTRIBUTES; buffer: Tbuffer; function IsWinNT: boolean;//Funsion auxiliar var OSV: OSVERSIONINFO; begin OSV.dwOSVersionInfoSize := sizeof(osv); GetVersionEx(OSV); result := OSV.dwPlatformId = VER_PLATFORM_WIN32_NT; end; // La siguiente funsion crea el redireccionamiento (PIPE) tuberia procedure TFormMain.Createpipe(cmdline : string); // se le debe pasar programa de consola a controlar var ProcessInfo : TProcessInformation; startupInfo : TStartupInfo; namep,Programexe:Pchar; begin if IsWinNT then begin InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@sd, true, nil, false); sa.lpSecurityDescriptor := @sd; end else sa.lpSecurityDescriptor := nil; sa.nLength := sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle := true; if CreatePipe(newstdin1, write_stdin1, @sa, 0) then begin if CreatePipe(read_stdout1, newstdout1, @sa, 0) then begin GetStartupInfo(si); with si do begin dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; wShowWindow := SW_HIDE; hStdOutput := newstdout1; hStdError := newstdout1; hStdInput := newstdin1; //hStdInput :=GetStdHandle(STD_INPUT_HANDLE) end; Fillchar(Buffer, SizeOf(Buffer), 0); StrPCopy(buffer,cmdline); Fillchar(Buffer, SizeOf(Buffer), 0); GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1); Programexe:=pchar(cmdline); namep:=pchar(extractfilename(cmdline)); CreateProcess(nil, PChar(cmdline),nil, nil, True,CREATE_NEW_CONSOLE, nil, nil,Si, Pi); end; end end; //Este procedimiento lee sobre la tuberia creada function TFormMain.ReadPipe(var s:Tbuffer): Boolean; var dwAvail, dwRead : Cardinal; PipeHandle : THandle; lines:integer; begin Result := False; line:=''; dwAvail := 6; PipeHandle:=read_stdout1; lines:=1; repeat PeekNamedPipe(read_stdout1, @buffer, SizeOf(buffer) - 1, @bread, @avail, nil);// inspecciona si hay algo en la tuberia sin extraer if bread>0 then begin ReadFile(read_stdout1, buffer, bread, bread, nil);// lee pipe line:=buffer;//deposita en line contenido buffer memo1.Lines.Add(buffer); inc(lines); end; Application.ProcessMessages; //GetExitCodeProcess(pi.hProcess, exitcod); until (bread=0); if bread>0 then Result := True else result := false; s:=buffer; Application.ProcessMessages; end; // Este procedimiento escribe sobre la tuberia (envia comandos a programa de consola) procedure TFormMain.WritePipe(s: string); var Pstr : Tbuffer; len : cardinal; Wasok:boolean; begin StrPCopy(Pstr, s); len := length(s); Wasok:=Writefile(write_stdin1, Pstr, len, len, nil); //se debe escribir sobre la entrada standart de proceso de consola if not wasok then showmessage('error write in pipe') end; y todos nos ayudamos mutuamentes |
#3
|
|||
|
|||
Delphi e interfaz UCI
Rolando,
podrías poner el código completo. He intentado manejar el stdinput y stdoutput con diferentes versiones de código y simplemente no puedo echar a andar ningún uci engine con mi programa. Gracias de antemano. saludos Manuel López |
#4
|
|||
|
|||
Hallé en el sitio torry . net un componente threaded tpipe. Hace la comunicación simple y sin problemas. Eso resolvió mis dificultades, para quien le interese. Está en el sitio mencionado, en la sección system.
saludos |
#5
|
|||
|
|||
Por favor MORSA ¿puedes explicarnos un poco como lo adaptaste? o ¿no tacaste el codigo?.
Gracias. |
#6
|
|||
|
|||
Morsa no responde pero he estado estudiando el codigo de Torry.
Consigo que se abra la aplicacion con CreateProcess pero luego no puedo enviar ni recibir nada mas por las pipes creadas. ¿Alguien puede hechar una mano, por favor?. |
#7
|
|||
|
|||
Resuelto. El codigo de Torry.net funciona. Lo he conseguido adaptar a mis necesidades. Ha llevado bastante tiempo y dedicación pero va muy bien.
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Crear aplicación de consola con delphi | adpa | Varios | 8 | 06-10-2012 20:58:09 |
comando start desde delphi? | Cristalero | API de Windows | 1 | 25-11-2009 16:03:23 |
ejecucion de aplicacion en java desde consola | Alejo | JAVA | 0 | 11-06-2005 19:00:18 |
Ejecutar comando runas desde delphi | bykram | API de Windows | 10 | 29-12-2004 20:29:24 |
Comando Source Fichero.sql Desde Delphi | Lionel | SQL | 1 | 25-03-2004 20:00:57 |
|