Wednesday, 3 June 2009

Capturar la salida de una aplicación DOS con Delphi

No os ha interesado alguna vez leer la salida estándar de una aplicación (stdout) para poder visualizar su contenido en nuestra aplicación, o simplemente para tratar el texto que devuelve? Pues bien, con Delphi lo podemos hacer. No es sencillo, pero con las herramientas necesarias si. Por ejemplo, imaginad que queremos ver el valor que devuelve ejecutar la sentencia java -version en nuestra máquina. El resultado es el siguiente:

Pues, como podemos capturar esa salida en nuestra aplicación?.

Utilizando TDosCommand. Dos Command 2.0 es un componente gratuito de Delphi. Lo podemos encontrar en Maxx's Delphi Site, y es libre de descarga. El componente es bastante fácil de instalar y de ejecutar, y mediante 3 líneas de código podemos capturar el stdout en un TMemo. El ejemplo que propongo es el siguiente:

Primero, podemos crear un bpl e instalar el fichero DosCommand.pas como un package. Pero también podemos crear un proyecto nuevo y agregarlo como fuente externa. Funciona de las 2 maneras. En ese caso, creo un nuevo proyecto, con un botón y un TMemo, y luego con el DosCommand agregado en mi proyecto escribo:




unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellAPi, DOsCommand, ExtCtrls;

type
TFTest = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
FTest: TFTest;
dos: TDosCommand;

implementation

{$R *.dfm}

procedure TFTest.Button1Click(Sender: TObject);
begin
dos.CommandLine := 'java -version';
dos.Execute;
end;

procedure TFTest.FormCreate(Sender: TObject);
begin
memo1.Clear;
dos := TDosCommand.create(self);
dos.OutputLines := memo1.lines;
end;

procedure TFTest.FormDestroy(Sender: TObject);
begin
FreeAndNil(dos);
end;

end.




una vez escribo el comando del cual quiero capturar su salida, le doy al botón get et voilà:

Ahora ya tenemos la salida de la aplicación, pero no abusar mucho del componente, ya que utiliza hilos para poder capturar la salida de la aplicación. Si hacemos demasiadas peticiones puede ser que saturemos la pila del sistema (ya lo he intentado, y si!).

Aquí os dejo la aplicación de muestra ThundaxSTDOUT.exe, donde he puesto una textbox para entrar el comando que queráis. Aquí os dejo una muestra de la ejecución de un comando:


En la web de Lazarus, también he encontrado un componente llamado TProcess, que permite capturar la salida de un programa casi de la misma manera, utilizando un TStringList. Pero no acaba de funcionar. Os dejo los enlaces por si queréis indagar en el tema.


4 comments:

  1. por que me salen letras chinas o caracteres raros con ejemplo y varios que e descargado

    ReplyDelete
  2. por que salen caracteres raros o chinos con tu ejemplo y varios que e descargado tene que ver con la conversion unicode esto usando XE3

    ReplyDelete
    Replies
    1. Hola Edgar,

      Mira que estes utilizando correctamente Unicode. Si tratas los datos en unicode y luego la salida no la tratas tambien en unicode, te saldran caracteres raros.

      Jordi

      Delete
  3. Hola
    Estoy add project esta unit DosComand.pas y me da el siguiente error, [dcc32 Error] DosCommand.pas(211): E2100 Data type too large: exceeds 2 GB, utilizo Delphi XE8. Le agradesco si me puede ayudar. muchas gracias

    ReplyDelete