AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen
Thema durchsuchen
Ansicht
Themen-Optionen

Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

Ein Thema von Paul Schmidt · begonnen am 8. Okt 2020 · letzter Beitrag vom 9. Okt 2020
Antwort Antwort
Seite 1 von 2  1 2      
Paul Schmidt

Registriert seit: 7. Feb 2006
22 Beiträge
 
#1

Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 10:37
Hallo liebe Gemeinde!

Ich rufe per CreateProcess ein externes Programm auf (genauer: git).
Dieses wird in einer Konsole ausgeführt, abgearbeitet und bei Beendigung wieder geschlossen.

Eigentlich hatte ich vor, das Konsolenfenster gar nicht anzuzeigen und die Ausgabe der Konsole bzw. des externen Programms (hier: git) "live" in einem Memo anzuzeigen, allerdings habe ich bis heute hierzu noch keine wirkliche Lösung gefunden, da alle Ansätze darauf beruhen, die Ausgabe der Konsole erst NACH Beendigung abzurufen.

In meinem Fall (git) ist es allerdings so, dass beim Hoch- oder Herunterladen (pull, push) in der Konsole der Down/Upload Fortschritt angezeigt wird. Und hier ist es offenbar nicht möglich, solche Ausgaben wirklich zeitgleich abzufragen.


Nun war meine Idee, dass ich für den Aufruf via CreateProcess das Konsole-Fenster einfach anzeigen lasse. Das funktioniert auch.
ABER: ich möchte gern bei Beendigung des Aufrufes den Inhalt des Konsolen-Fensters in einem String speichern.
Nur weiß ich nicht, wie ich das anstellen kann.

Also: ich möchte den Aufruf per CreateProcess in einem sichtbaren Konsolen-Fenster ausführen lassen, aber anschließend dessen Inhalt in einem String speichern/abrufen.

Kann mir jemand dabei bitte helfen?
Alle bisher gefundenen Ansätze lassen entweder nur die Ausgabe in eine Pipe oder die Anzeige des Konsolen-Fensters zu.
Nicht aber das nachträgliche Abrufen des Inhalts des Konsolen-Fensters (bei Beendigung des Prozesses).

Herzlichen Dank im Voraus!

Grüße,
Paul
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 11:07
Die Pipe ist doch schon der richtige Ansatz! Bzw. zwei davon, stdout und errout. Ob während der Laufzeit oder danach liefern sie die Ausgaben. In den STARTUPINFO von CreateProcess musst Du die Pipes halt angeben. Dann geht das Live.

Das später aus einem Terminal auszulesen dürfte ungleich schwieriger sein.
  Mit Zitat antworten Zitat
Paul Schmidt

Registriert seit: 7. Feb 2006
22 Beiträge
 
#3

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 13:17
Das Problem bzgl. Pipe ist, dass es eigentlich für 95% der Fälle funktioniert. Nur eben für den entsprechenden Aufruf (push) nicht, welcher eine Ausgabe in der Konsole erzeugt, die einen Upload-Fortschritt anzeigt: gleichbleibende Zeile mit aufsteigenden Prozent-Werten
So in der Art:
[10 / 20] 30%

(und dann eben in der gleichen Zeile: [14 / 20] 57% usw.)

Die sonstigen Aufrufe von git (wie bspw. "init", "status", usw.) funktionieren.

Deshalb weiß ich im Moment nicht, wo der Fehler hierbei liegt bzw. wie ich das korrigieren kann.
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
678 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 13:45
Was genau funktioniert dabei denn nicht? Das "In der Zeile" läuft über CR statt CRLF. Trennt man den String aus der Pipe grob, hat man das CR als komplett neue Zeile, dann steht der Fortschritt unschön untereinander.

Alternative 1: In meinem Lazarus VCS Helper löse ich das Problem anders - dort steuere ich TortoiseGit, das bringt das UI für viele Operationen gleich mit.

Alternative 2: direkt libgit2 zu verwenden. Habe ich mal angefangen, aber weil obiges so gut funktioniert nicht weitergeführt (auch im verlinkten repository).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 13:56
Steht das Verschieben des Cursors nicht auch im Stream? z.b. als EscapeCodes ... diese müsste man dann eben entsprechend mit auswerten.



libgit2

Hatte ich vor Kurzem auch mal versucht anzufangen. (hab es aus Zeizmangel und dem enormen Umfang zurückgestellt, aber möchte irgendwann mal weitermachen)
Die Delphi-QuellCodes im GIT-Quellcode sind katastrophal veraltet und nicht mehr funktionsfähig.

Ein paar Nachteile, wenn man die libgit direkt verlinkt/einkompilert:
* einkopmpiliert: Updates lassen sich nur noch durch neukomplieren des Programms bewerkstelligen
* beim Linken gegen eine DLL ... so lange sich die genitzten Schnittstellen nicht ändern, dann ginge das schon besser

* Aufruf der Console bringt die wenigstens Funktionsprobleme/Abhängigkeiten, da sich beim GIT bekanntlich die Steuerung/Ausgaben der Console seltener ändern, als die internen APIs.
(vorallem im Linuxumfeld wird die Console häufig ferngesteuert, drum ist der Teil stabiler)
$2B or not $2B
  Mit Zitat antworten Zitat
Paul Schmidt

Registriert seit: 7. Feb 2006
22 Beiträge
 
#6

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 15:32
@CCRDude

Das Problem ist, dass bei einem Aufruf von "push" keine Daten über die Pipe ankommen.
Also die von mir beschriebene Ausgabe, die man eigentlich in der Konsole sehen würde (der Fortschritt usw.), kommt bei einem "push" gar nicht über die Pipe an.
Bei diesen Aufruf läuft git - je nachdem wie lange der Upload dauert - im Hintergrund, ohne das ich über die Pipe irgendwelche Daten bekomme.

Bei einem "status" oder "init" oder "add" usw. kommen die Ausgaben der Konsole in der Pipe an und ich kann diese auch entsprechend mitloggen.
Aber bei einem "push" bleibt es eben komplett leer...

Hier mal der Ausschnitt, den ich verwende:
an "Callback" wird der Inhalt der Pipe übergeben. Also die jeweilige Konsolen-Ausgabe.

Delphi-Quellcode:
  saSecurity.nLength := SizeOf(TSecurityAttributes);
  saSecurity.bInheritHandle := true;
  saSecurity.lpSecurityDescriptor := nil;
  if CreatePipe(hRead, hWrite, @saSecurity, 0) then
  begin
    try
      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
        try
          repeat
            dRunning := WaitForSingleObject(piProcess.hProcess, 100);
            PeekNamedPipe(hRead, nil, 0, nil, @dAvailable, nil);
            if (dAvailable > 0) then
              repeat
                dRead := 0;
                ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
                pBuffer[dRead] := #0;
                OemToCharA(pBuffer, dBuffer);

                if Assigned(CallBack) then
                begin
                  pOutput := string(dBuffer);
                  CallBack(dBuffer);
                end;
              until (dRead < CReadBuffer);
            Application.ProcessMessages;
          until (dRunning <> WAIT_TIMEOUT);

          GetExitCodeProcess(piProcess.hProcess, exitcode);
        finally
          CloseHandle(piProcess.hProcess);
          CloseHandle(piProcess.hThread);
        end;
    finally
      CloseHandle(hRead);
      CloseHandle(hWrite);
    end;
  end;
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#7

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 15:38
Naja, formulieren wir es mal so:

Wenn ein Konsolenprogramm für die Ausgabe nicht StdOut nutzt, bekommt man die Ausgabe nicht.

Bei einer Umleitung der Ausgabe (auf der Kommandozeile) in eine Datei, wirst Du (vermutlich) auch keine Ausgabe bekommen.
  Mit Zitat antworten Zitat
Paul Schmidt

Registriert seit: 7. Feb 2006
22 Beiträge
 
#8

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 15:47
Zitat:
Bei einer Umleitung der Ausgabe (auf der Kommandozeile) in eine Datei, wirst Du (vermutlich) auch keine Ausgabe bekommen.
Stimmt! Das ist in Falle von "push" ebenfalls leer.

Das ist natürlich blöd!

Komme ich irgendwie auf anderen Wege an den Inhalt der Konsole, wenn ich createProcess mit "SW_SHOWNORMAL" ausführe?
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#9

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 15:50
Nein, da gehe ich nicht von aus.

Neben StdIn, StdOut, StdErr kann man auch bei Konsolenprogrammen Ein- und Ausgaben realisieren.

Die drei StdIn, StdOut, StdErr sind dazu da, Konsolenprogramme miteinander kommunizieren zu lassen. Das ist ein kann, kein muss.
  Mit Zitat antworten Zitat
Paul Schmidt

Registriert seit: 7. Feb 2006
22 Beiträge
 
#10

AW: Ausführung in sichtbarer Konsole und Inhalt der Konsole (Text) abfragen

  Alt 8. Okt 2020, 15:53
Schade!

Trotzdem: herzlichen Dank für Deinen Hinweis! Nun hat zumindest das Grübeln ein Ende, warum es bei diesem Aufruf nicht funktioniert.

Grüße,
Paul
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 18:30 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