Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi JVCL: TJvCreateProcess (https://www.delphipraxis.net/69115-jvcl-tjvcreateprocess.html)

sundance 10. Mai 2006 12:54


JVCL: TJvCreateProcess
 
Hallo Delphi-Fans,

vielleicht kann mir jemand von euch bei einem Problem helfen.
Ich versuche, aus einem Delphiprogramm heraus eine 32-Bit-Konsolenanwendung zu starten und die laufende Ausgabe zurück ins aufrufende Delphiprogramm zu leiten. Ich habe ausser mit TJvCreateProcess() auch schon mit einigen anderen Komponenten (die letzlich alle auf den API-Funktionen CreateProcess() und CreatePipe() beruhen) experimentiert, aber alle zeigen bei bestimmten Konsolenprogrammen (wavegain.exe oder flac.exe (beides zur Audiobearbeitung bzw. Dekodierung)) den Effekt, dass die während der Laufzeit anfallenden Bildschirmausgaben, die man sonst im Konsolenfenster zu sehen bekommt, erst nach Beendigung der externen Applikation komplett übergeben werden. Der entsprechende OnRead-Event wird während der Laufzeit nicht getriggert. Es hilft auch nichts, die Konsolenanwendung mit niedrigster Priorität zu starten. Andere (z.B. lame.exe) hingegen funktionieren wie erwartet.

Läßt sich dieses Verhalten irgendwie ändern?
Oder gibt's eine Komponente, die das "richtig" macht?

-sundance-

Robert Marquardt 10. Mai 2006 14:29

Re: JVCL: TJvCreateProcess
 
Willkommen bei der DP.

Bei TJvCreateProcess kann man auch den OnRawRead Event implementieren.
Soweit ich bei einem Blick in die Sourcen erkenne konnte wird erst ein OnRawRead ausgeloest und dann der Inhalt geparst und als OnRead nochmals gemeldet.
Wenn das Programm nicht einfach zeilenweise mit CR LF ausgibt, sondern beispielsweise mit nur CR eine Fortschrittsanzeige realisiert, dann geraet das parsen aus dem Tritt.

sundance 10. Mai 2006 17:06

Re: JVCL: TJvCreateProcess
 
Hallo Robert,

vielen Dank für deine schnelle Antwort.
Ich bin mir ziemlich sicher, dass ich den OnRawRead-Event auch beobachtet habe und dass der ebenfalls erst am Schluß zu Zug kam. Außerdem gibt zumindest 'wavegain.exe' seine Zeilen mit ganz normalem CR/LF aus:
Delphi-Quellcode:
Aus dem Quelltext von wavegain.exe:
      fprintf(stderr, " %+6.2f dB | %6.0f | %5.2f | %8.0f | %4d |  %4d | %s[b]\n[/b]",
         *track_gain, peak, scale, new_peak, dc_l, dc_r, filename);
Aber ich teste das nochmal und melde mich hier wieder...

-sundance-

jbg 10. Mai 2006 17:32

Re: JVCL: TJvCreateProcess
 
Zitat:

Oder gibt's eine Komponente, die das "richtig" macht?
Höschtwahrscheinlich nicht, denn einige Konsolenprogramme merken, dass du STDOUT in eine Pipe order Datei umleitest und fangen an ihre Ausgaben zu puffern. Diese werden erst ausgegeben, wenn der Puffer voll ist oder das Programm beendet wird. Vor allem C Programme sind dafür bekannt. Ein Beispiel stellt auch der in C geschriebene Delphi Compiler dcc32.exe dar.

Zitat:

Zitat von sundance
Läßt sich dieses Verhalten irgendwie ändern?

Ja, indem man durch DLL injektion und geschicktes API Hooking dem Programm vorgaukelt, es würde in eine Konsole schreiben. Ist aber schon ein ganzes Stück komplizierter als einfaches API Hooking.

sundance 10. Mai 2006 19:10

Re: JVCL: TJvCreateProcess
 
jbg,
Zitat:

...einige Konsolenprogramme merken, dass du STDOUT in eine Pipe order Datei umleitest und fangen an ihre Ausgaben zu puffern. Vor allem C Programme sind dafür bekannt.
Passiert das dann in den entsprechenden C-Bibiliothsfunktionen (fprintf) oder in der Anwendung selbst? In obigem Beispiel habe ich nichts derartiges gefunden, nur einfache Aufrufe von fprintf(stderr,...).

Nachtrag:
Ich fürchte, du hattest recht.
Habe gerade versucht, unter 4NT mit 'tee' den stderr-Kanal 'abzuzweigen', d.h. gleichzeitig nach stdout und in eine Datei zu schreiben und, was soll ich sagen, erst nachdem wavegain.exe fertig ist, erscheint auf der Konsole der gesamte Text (während z.B. das DIR-Kommando über tee zeilenweise schreibt...

-sundance-


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz