Einzelnen Beitrag anzeigen

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