AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Consolenausgaben LIVE abfangen
Thema durchsuchen
Ansicht
Themen-Optionen

Consolenausgaben LIVE abfangen

Ein Thema von DelTurbo · begonnen am 20. Aug 2015 · letzter Beitrag vom 21. Aug 2015
Antwort Antwort
nahpets
(Gast)

n/a Beiträge
 
#1

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 14:54
Hallo,

probiere es bitte mal mit dem anhängenden Testprojekt.

In des Unit sbPipes ist eine Komponenten, die eigentlich die von Dir gewünschte Aufgabe erledigen sollte.

Für die Ausgabe kannst Du ihr ein TMemo zuweisen, dann übernimmt die Komponente die Ausgabe, eine Stringliste, auch dann übernimmt die Komponente die Ausgabe in die Stringliste oder Du nutzt das Ereignis OnOutput, dann musst Du selbst für die Ausgabe sorgen.

Im Ereignis OnNotify kannst Du Meldungen der Komponente ausgeben, den Exitcode Deines aufzurufenden Programmes und die Anzahl der gelesenen Bytes in der Ausgabe.

Hab's Beispielprogramm gerade mal getestet, unter Windows XP mit Delphi 7 läuft es.

Geändert von nahpets (21. Nov 2017 um 16:41 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 15:06
CaptureConsoleOutput

Delphi-Quellcode:
procedure CaptureConsoleOutput(const ACommand, AParameters: String; AMemo: TMemo);
const CReadBuffer = 2400;
var
   saSecurity: TSecurityAttributes;
   hRead: THandle;
   hWrite: THandle;
   suiStartup: TStartupInfo;
   piProcess: TProcessInformation;
   pBuffer: array[0..CReadBuffer] of ANSIChar;
   dRead: DWord;
   dRunning: DWord;
begin
   saSecurity.nLength := SizeOf(TSecurityAttributes);
   saSecurity.bInheritHandle := True;
   saSecurity.lpSecurityDescriptor := nil;

   if CreatePipe(hRead, hWrite, @saSecurity, 0) then
   begin
     FillChar(suiStartup, SizeOf(TStartupInfo), #0);
     suiStartup.cb := SizeOf(TStartupInfo);
     suiStartup.hStdInput := hRead;
     suiStartup.hStdOutput := hWrite;
     suiStartup.hStdError := hWrite;
     suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
     suiStartup.wShowWindow := SW_HIDE;

     if CreateProcess(nil, PChar(ACommand + ' ' + AParameters), @saSecurity,
       @saSecurity, True, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess)
       then
     begin
       repeat
         dRunning := WaitForSingleObject(piProcess.hProcess, 100);
         Application.ProcessMessages();
         repeat
           dRead := 0;
           ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
           pBuffer[dRead] := #0;
           OemToAnsi(pBuffer, pBuffer);
           AMemo.Lines.Add(String(pBuffer));
         until (dRead < CReadBuffer);
       until (dRunning <> WAIT_TIMEOUT);
       CloseHandle(piProcess.hProcess);
       CloseHandle(piProcess.hThread);
     end;
     CloseHandle(hRead);
     CloseHandle(hWrite);
   end;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
CaptureConsoleOutput('cmd.exe', '/c dir c: /s', Memo1);
end;
  Mit Zitat antworten Zitat
DelTurbo

Registriert seit: 12. Dez 2009
Ort: Eifel
1.197 Beiträge
 
Delphi 2007 Architect
 
#3

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 15:17
@nahpets, leider klappt es nicht. Beim laden kommt schon das er TTriggerPipe nicht findet. Ich habe es dann in Privat reingemacht und beim Button1Click erstellt. Dann kann ich es übersetzen und starten, aber leider kommt da nichts.

Das Programm, was in edKommandoZeile steht, wird nicht gestartet.

@hathor, das habe ich auch gefunden und probiert. Leider bleibt es wie alle anderen bei ReadFile stehen bis das aufgerufene Programm fertig ist.

Gruß und danke schonmal
Alle meine Rechtschreibfehler sind Urheberrechtlich geschützt!!
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#4

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 15:28
Bei mir läuft's mit XE7 und WIN8.1.

Mach doch bitte ein COPY&PASTE und teste es!

Hast Du die vertikale Scrollbar beim Memo aktiviert?

Ich habe mal die EXE angefügt.
Angehängte Dateien
Dateityp: zip CaptureConsole.zip (595,0 KB, 14x aufgerufen)

Geändert von hathor (20. Aug 2015 um 15:47 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: Consolenausgaben LIVE abfangen

  Alt 20. Aug 2015, 15:46
Da TriggerPipe eine Komponente ist, solltest Du sie eventuell installieren, dann kann Delphi sie auch finden.

Wenn allerdings alle Routinen, die Du probiert hast, Dein Programm nicht starten, hast Du vermutlich kein Problem mit Delphi und der Verarbeitung von Pipes, sondern ein vollkommen anderes.
Wenn
Code:
cmd.exe /c dir c:\
nicht gestartet wird, erscheint mir das schon sehr seltsam.

Bei meiner Routine steht in der Caption des Formulares nach dem Aufruf auch der Exitcode. Was steht denn bei Dir dort?
Bei dem cmd von oben sollte der ExitCode 0 sein, sonst wurde der Prozess erst garnicht gefunden oder hat sich (aus welchen Gründen auch immer) verabschiedet.

Ändere bitte mal in meinem Teil die Routine TForm1.Button1Click ab:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  meOutput.Lines.Clear;
  // Das kann ein bisserl dauern...
  TriggerPipe.CommandLine := 'cmd.exe /c dir c:\ /s';
  if not TriggerPipe.Execute then begin
    ShowMessage(Format('Rückgabewert: %d',[TriggerPipe.ReturnCode]));
  end else begin
    ShowMessage('Eigentlich sollte das hier alles Ordnunggemäß funktioniert haben.');
  end;
end;
Was bekommst Du hier zu sehen?

Das über TriggerPipe gestartete Programm sollte im Taskmanager zu sehen sein, ist dem so?

Was ist das denn für ein Programm, das Du da aufrufen möchtest?

Steht es im gleichen Verzeichnis, wie das von Dir erstellte Programm?
Oder gibst Du den Programmname mit vollständigem Pfad an?
Oder ist das Programm über den Suchpfad von Windows zu erreichen?
Startet das Programm, wenn Du in dem Verzeichnis, in dem die von Dir erstellte Exe liegt, über die Konsole aufrufst?
Wenn nein, welche Meldung wird ausgegeben?
Was passiert, wenn Du eine Kommandozeile aufmachst, nach c:\ ins Hauptverzeichnis wechselst und das Programm dann dort aufrufst? Klappt das? Wenn ja, bitte Screenshot hier zur Verfügung stellen, eventuell kann man daran erkennen, ob das Programm überhaupt StdIn und StdOut von Windows nutzt. Wenn nicht, hast Du mit den hier besprochenen Routinen keine Chance.
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:02 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