2009-07-31 9 views

Odpowiedz

13

Co z tym solution.


Edycja: związek prowadzi do tego roztworu (lekko refactored czytelności i usunięcia zastosowanie 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

fajna propozycja dla tych, którzy śledzą link, ale sam link nie jest dobrą odpowiedzią, zobacz: http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links - gdzie indziej-naprawdę-dobre-odpowiedzi – Argalatyr

+0

Wysłałem kod z linku. – Mick

+0

@Mick: oops - podczas gdy robiłeś to w nowej odpowiedzi, edytowałem stary. Jeśli ktoś czuje, że moja zmiana powinna zostać wycofana, możesz to zrobić. – Argalatyr

2

zwykle wykorzystać ten przenoszony kod FPC: http://www.stack.nl/~marcov/processdelphi.zip

Zawiera klasa do kontrolowania programów zewnętrznych (jest to klasa używana przez Lazarusa do wywoływania kompilatora cmdline i innych programów).

Dokumentacja jest tutaj, ale port delphi jest nieco stary, więc nie wszystkie udokumentowane właściwości mogą istnieć w powyższej wersji.

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

+0

To wygląda świetnie! –

+0

W ostatnich wersjach FPC, kilka prostych procedur, które naprawiają kilka najprostszych scenariuszy zostały dodane jako "RunCommand() –

1

tylko niewielki dodatek do Marco odpowiedzi, za pomocą jednostki TProcess jest dokładnie wyjaśnione here

Wierzę, że to jest najprostszym sposobem, aby to zrobić. Powodzenia!

Powiązane problemy