2009-07-31 34 views

Respuesta

13

¿Qué hay de este solution.


EDIT: el enlace conduce a esta solución (ligeramente refactorizado para legibilidad y para eliminar el uso de with):

// The example runs 'chkdsk.exe c:\' and displays the output to Memo1. 
// Put a TMemo (Memo1) and a TButton (Button1) on your form. Put this 
// code in the OnCLick event procedure for Button1: 

procedure TForm1.RunDosInMemo(DosApp:String;AMemo:TMemo) ; 
const 
    ReadBuffer = 2400; 
var 
    Security : TSecurityAttributes; 
    ReadPipe, 
    WritePipe : THandle; 
    start  : TStartUpInfo; 
    ProcessInfo : TProcessInformation; 
    Buffer  : Pchar; 
    BytesRead : DWord; 
    Apprunning : DWord; 

begin 
    Security.nlength := SizeOf(TSecurityAttributes) ; 
    Security.binherithandle := true; 
    Security.lpsecuritydescriptor := nil; 
    if Createpipe (ReadPipe, WritePipe, @Security, 0) then 
    begin 
    Buffer := AllocMem(ReadBuffer + 1) ; 
    FillChar(Start,Sizeof(Start),#0) ; 
    start.cb := SizeOf(start) ; 
    start.hStdOutput := WritePipe; 
    start.hStdInput := ReadPipe; 
    start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; 
    start.wShowWindow := SW_HIDE; 
    if CreateProcess(nil, 
        PChar(DosApp), 
        @Security, 
        @Security, 
        true, 
        NORMAL_PRIORITY_CLASS, 
        nil, 
        nil, 
        start, 
        ProcessInfo) then 
    begin 
     repeat 
     Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100); 
     Application.ProcessMessages; 
     until (Apprunning <> WAIT_TIMEOUT) ; 
     repeat 
     BytesRead := 0; 
     ReadFile(ReadPipe,Buffer[0], 
     ReadBuffer,BytesRead,nil) ; 
     Buffer[BytesRead]:= #0; 
     OemToAnsi(Buffer,Buffer) ; 
     AMemo.Text := AMemo.text + String(Buffer) ; 
     until (BytesRead < ReadBuffer) ; 
    end; 
    FreeMem(Buffer) ; 
    CloseHandle(ProcessInfo.hProcess) ; 
    CloseHandle(ProcessInfo.hThread) ; 
    CloseHandle(ReadPipe) ; 
    CloseHandle(WritePipe) ; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject) ; 
begin 
    RunDosInMemo('chkdsk.exe c:\', Memo1) ; 
end; 
+3

sugerencia agradable para aquellos que siguen el enlace, pero un enlace solo no es una muy buena respuesta, ver: http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links -elsewhere-really-good-answers – Argalatyr

+0

Publiqué el código del enlace. – Mick

+0

@Mick: oops: mientras hacías eso en una nueva respuesta, estaba editando el anterior. Si alguien siente que mi edición debe revertirse, siéntete libre de hacerlo. – Argalatyr

2

que suelen utilizar este portado FPC código: http://www.stack.nl/~marcov/processdelphi.zip

Contiene una clase para controlar programas externos (es la clase utilizada por Lazarus para llamar al compilador cmdline y otros programas).

La documentación está aquí, pero el puerto delphi es un poco viejo, por lo que no todas las propiedades documentadas pueden existir en la versión anterior.

http://www.freepascal.org/docs-html/fcl/process/index.html

+0

¡Esto se ve genial! –

+0

En versiones recientes de FPC, se han agregado algunos procedimientos simples que solucionan algunos de los escenarios más simples como "RunCommand() –

1

Sólo una pequeña adición a Marco respuesta, utilizando la unidad TProcess se explica a fondo here

Creo que esta es la manera más fácil de hacerlo. ¡Buena suerte!

Cuestiones relacionadas