Entwickler-Ecke

Windows API - GetConsoleOutput "live" mitschneiden


Jojojoxx - Sa 19.04.08 17:25
Titel: GetConsoleOutput "live" mitschneiden
Hallo!

Wenn ich einen Aufruf über GetConsoleOutput mache, erhalte ich erst nach dem Programmende die Konsolenausgaben.
Lässt es sich irgendwie einrichten, dass ich die Ausgaben während der Laufzeit des aufgerufenen Programms auslesen kann?
Danke euch!
mfg

Jojo


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Sa 26.04.2008 um 23:52


BenBE - Fr 25.04.08 20:23

Schau Dir mal TDosCommand an, die kann das.

Grundlegend funktioniert das etwa so:

Man öffne zwei Pipes (eine Eingabe, eine Ausgabe), wenn gewünscht ne Dritte (für Fehlerausgaben).

Man initialisiere von Hand eine Startup-Info-Struktur it den nötigen Werten
Man dupliziere die oben genannten Handles für Iheritable-Zugriff durch den neuen Prozess.

Trage die geklonten Handles in die Startup-Info ein.

Man rufe CreateProcess oder CreateProcessEx auf, um den Prozess zu starten.

Man überprüfe mit WaitForSingleObject auf das Prozess-Handle, ob der fremde Prozess noch läuft (Timeout verwenden, typisch 50-100ms).

In regelmäßigen Abständen über die Pipes schauen, ob neue Daten da sind.

Soviel zum Grobablauf; Beispiel wie's geht, gibt's in TDosCommand (suche Forum).

MfG,
BenBE.


oOXTCOo - Fr 12.12.08 22:30
Titel: GetConsoleOutput
hallo leute!

ich habe heute genau das selbe problem...

ich habe eine konsolenanwendung die einen fortschrittsbalken hat,
da sie eine große datei ladet...

ich möchte diese ausgabe direkt in meiner anwendung anzeigen lassen...

mein programm bleibt aber für eine gute minute stehen und zeit dann
alles aufeinmal an, der fortschrittsbalken kommt dann in einzelne stings an...

also in etwas so:
/1%
//2%
///3%
bis zu
//////////////////////////////////////////////////100%

hat hier jemand ein kleines beispiel, wie ich das in echtzeit in meinem
programm anzeigen lassen kann?

wäre echt super, denn so wie ichs jetzt habe, weiß ich nie ob alles
okay ist, oder ob das programm stecken geblieben ist...

danke im vorraus...


jaenicke - Fr 12.12.08 22:38

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Schau Dir mal TDosCommand an, die kann das.
Hast du das mal damit versucht? Und wenn ja, wo ist dabei das Problem? Und wenn nein, warum nicht? ;-)


oOXTCOo - Fr 12.12.08 23:31

ich suche gerade dannach...


das hört sich genau nachdem an was ich suche:
this component let you execute a dos program (exe, com or batch file) and catch
the ouput in order to put it in a memo or in a listbox, ...
you can also send inputs.
the cool thing of this component is that you do not need to wait the end of
the program to get back the output. it comes line by line.


http://maxxdelphisite.free.fr/doscmd.htm


jaenicke - Fr 12.12.08 23:34

:shock: Google kennst du aber schon, oder?
Suche bei Google TDOSCOMMAND
Gleich das erste Ergebnis ist es...
http://maxxdelphisite.free.fr/doscmd.htm
Was gibts da lange zu suchen? ;-)


oOXTCOo - Fr 12.12.08 23:35

hab ich schon gefunden...

ich wollte wissen ob es mit der von mir verwendeten komponente möglich ist,
aber scheinbar nicht...


jaenicke - Fr 12.12.08 23:37

Doch, theoretisch schon, du müsstest an den Stellen wo die Pipes ausgelesen werden die Ausgaben direkt verwenden statt sie nur in die StringLists zu schreiben.

Genau das macht TDosCommand.


oOXTCOo - Fr 12.12.08 23:39

ich habe delphi schon so lange nicht mehr verwendet,
ich bekomme die komponente einfach nicht installiert...


es kann kein build erstellt werden, die lizens ist abgelaufen...


oOXTCOo - Fr 12.12.08 23:44

okay, sieht aus als funtkioniert es nun, danke!