Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Ejecutar comando msdos y capturar resultado (salida)
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Ejecutar comando msdos y capturar resultado (salida)

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Ejecutar comando msdos y capturar resultado (salida) Responder citando

¿Cómo puedo capturar la salida de la ejecución de un comando msdos con Delphi? estoy haciendo una aplicación que tiene que ejecutar un comando msdos, en concreto "netstat -a", y guardar el resultado en un fichero de texto ¿cómo puedo hacer esto?
MensajePublicado:
Mie Dic 16, 2009 8:36 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Ejecutar comando msdos y capturar resultado (salida) Responder citando



Anuncios



varios escribió:
¿Cómo puedo capturar la salida de la ejecución de un comando msdos con Delphi? estoy haciendo una aplicación que tiene que ejecutar un comando msdos, en concreto "netstat -a", y guardar el resultado en un fichero de texto ¿cómo puedo hacer esto?


Puedes descargarte gratuitamente (freeware) la aplicación que incluye el código fuente (open source), esta aplicación ejecuta un comando MS-DOS y muestra el resultado en un TMemo, por lo que puedes guardarlo en fichero:

La descarga:
http://www.ajpdsoft.com/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=258

El artículo que explica cómo funciona y sus características técnicas:
http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=442

El código fuente en Delphi:

Código:

unit UnidadMenuPrincipal;

{$R WinXP.res}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, shellapi, ThemeMgr;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    txtSalida: TMemo;
    dlGuardar: TSaveDialog;
    btGuardar: TBitBtn;
    btSalir: TBitBtn;
    LWEB: TLabel;
    txtComando: TComboBox;
    btEjecutar: TBitBtn;
    ThemeManager1: TThemeManager;
    Label2: TLabel;
    procedure btEjecutarClick(Sender: TObject);
    procedure btGuardarClick(Sender: TObject);
    procedure btSalirClick(Sender: TObject);
    procedure LWEBClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function IsWinNT: boolean;
var
  OSV: OSVERSIONINFO;
begin
  OSV.dwOSVersionInfoSize := sizeof(osv);
  GetVersionEx(OSV);
  result := OSV.dwPlatformId = VER_PLATFORM_WIN32_NT;
end;

function ejecutarComando (comando : string) : string;
var
  Buffer: array[0..4096] of Char;
  si: STARTUPINFO;
  sa: SECURITY_ATTRIBUTES;
  sd: SECURITY_DESCRIPTOR;
  pi: PROCESS_INFORMATION;
  newstdin, newstdout, read_stdout, write_stdin: THandle;
  exitcod, bread, avail: Cardinal;
begin
  Result:= '';
  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(newstdin, write_stdin, @sa, 0) then
  begin
    if CreatePipe(read_stdout, newstdout, @sa, 0) then
    begin
      GetStartupInfo(si);
      with si do
      begin
        dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
        wShowWindow := SW_HIDE;
        hStdOutput := newstdout;
        hStdError := newstdout;
        hStdInput := newstdin;
      end;
      Fillchar(Buffer, SizeOf(Buffer), 0);
      GetEnvironmentVariable('COMSPEC', @Buffer, SizeOf(Buffer) - 1);
      StrCat(@Buffer,PChar(' /c ' + comando));
      if CreateProcess(nil, @Buffer, nil, nil, TRUE, CREATE_NEW_CONSOLE, nil, nil, si, pi) then
      begin
        repeat
          PeekNamedPipe(read_stdout, @Buffer, SizeOf(Buffer) - 1, @bread, @avail, nil);
          if bread > 0 then
          begin
            Fillchar(Buffer, SizeOf(Buffer), 0);
            ReadFile(read_stdout, Buffer, bread, bread, nil);
            Result:= Result + String(PChar(@Buffer));
          end;
          Application.ProcessMessages;
          GetExitCodeProcess(pi.hProcess, exitcod);
        until (exitcod <> STILL_ACTIVE) and (bread = 0);
      end;
      CloseHandle(read_stdout);
      CloseHandle(newstdout);
    end;
    CloseHandle(newstdin);
    CloseHandle(write_stdin);
  end;
end;

function existeElemento (elemento : string; lista : TComboBox) : boolean;
var
  i : integer;
begin
  Result := false;
  for i := 0 to lista.Items.Count - 1 do
  begin
    if AnsiUpperCase(elemento) = AnsiUpperCase(lista.Items.Strings[i]) then
    begin
      Result := true;
      Exit;
    end;
  end;
end;

procedure TForm1.btEjecutarClick(Sender: TObject);
var
  fichero : string;
begin
  fichero := IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'comandos.txt';

  if not existeElemento (txtComando.Text, txtComando) then
  begin
    txtComando.Items.Add(txtComando.Text);
    txtComando.Items.SaveToFile(fichero);
  end;
  txtSalida.Text := ejecutarComando(txtComando.Text);
  if FileExists(fichero) then
    txtComando.Items.LoadFromFile(fichero);
end;

procedure TForm1.btGuardarClick(Sender: TObject);
begin
  if dlGuardar.Execute then
    txtSalida.Lines.SaveToFile(dlGuardar.FileName);
end;

procedure TForm1.btSalirClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.LWEBClick(Sender: TObject);
begin
  ShellExecute(Handle, Nil, PChar('http://www.ajpdsoft.com'),
      Nil, Nil, SW_SHOWNORMAL);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  fichero : string;
begin
  fichero := IncludeTrailingBackslash(ExtractFilePath(Application.ExeName)) + 'comandos.txt';
  if FileExists(fichero) then
    txtComando.Items.LoadFromFile(fichero);
end;

end.


La función que te interesa es ejecutarComando.
MensajePublicado:
Mie Dic 16, 2009 8:39 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A