AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Ausgabe einer Konsolenanwendung abfangen (simple Fassung)
Thema durchsuchen
Ansicht
Themen-Optionen

Ausgabe einer Konsolenanwendung abfangen (simple Fassung)

Ein Thema von stz · begonnen am 24. Aug 2008 · letzter Beitrag vom 2. Nov 2008
 
Benutzerbild von stz
stz

Registriert seit: 8. Sep 2005
Ort: Neuendeich, Lübeck
277 Beiträge
 
Turbo Delphi für Win32
 
#1

Ausgabe einer Konsolenanwendung abfangen (simple Fassung)

  Alt 24. Aug 2008, 16:05
Moin moin,
mithilfe von Jens Code und diesem Delphi-Treff Tipp habe ich eine kleine Funktion geschrieben, die eine Konsolenanwendung startet, auf deren Ende wartet und die Ausgabe als String zurückliefert:

Delphi-Quellcode:
function Konsole(const Command: String): String;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  SecurityAttr: TSecurityAttributes;
  OutputPipeRead, OutputPipeWrite: THandle;
  Res: Boolean;
  BufSize: Cardinal;
  Buffer: String;
  BytesRead: Cardinal;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle := true;
  SecurityAttr.lpSecurityDescriptor := nil;

  //Pipe erzeugen
  CreatePipe(OutputPipeRead, OutputPipeWrite, @SecurityAttr, 0);

  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb:=SizeOf(StartupInfo);
  StartupInfo.hStdInput := 0;
  StartupInfo.hStdOutput := OutputPipeWrite;
  StartupInfo.hStdError := OutputPipeWrite;
  StartupInfo.wShowWindow := SW_HIDE;
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  //Prozess erzeugen
  Res := CreateProcess(nil, PChar(command), nil, nil, true,
                   CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or
                   NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);

  //OutputPipeWrite schließen
  CloseHandle(OutputPipeWrite);

  Result := '';

  if Res then
  begin
    //OutputPipeRead auslesen
    SetLength(Buffer, 5000);
    BufSize := Length(Buffer);
    repeat
      Res := ReadFile(OutputPipeRead, Buffer[1], BufSize, BytesRead, nil);
      Result := Result + Copy(Buffer, 1, BytesRead);
    until not Res;

    //auf Prozessende warten
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end;

  //OutputPipeRead schließen
  CloseHandle(OutputPipeRead);
end;
Aufruf-Beispiel:
ShowMessage(Konsole('cmd /c dir C:\')); Grüße
Malte
Malte Schmitz
Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.

Entwickler des HTML-Editors MEdit (DP)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz