AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

JVCL: TJvCreateProcess

Ein Thema von sundance · begonnen am 10. Mai 2006 · letzter Beitrag vom 10. Mai 2006
Antwort Antwort
Benutzerbild von sundance
sundance

Registriert seit: 9. Mai 2006
98 Beiträge
 
Delphi 7 Professional
 
#1

JVCL: TJvCreateProcess

  Alt 10. Mai 2006, 12:54
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-
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: JVCL: TJvCreateProcess

  Alt 10. Mai 2006, 14:29
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.
  Mit Zitat antworten Zitat
Benutzerbild von sundance
sundance

Registriert seit: 9. Mai 2006
98 Beiträge
 
Delphi 7 Professional
 
#3

Re: JVCL: TJvCreateProcess

  Alt 10. Mai 2006, 17:06
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-
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

Re: JVCL: TJvCreateProcess

  Alt 10. Mai 2006, 17:32
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 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.
  Mit Zitat antworten Zitat
Benutzerbild von sundance
sundance

Registriert seit: 9. Mai 2006
98 Beiträge
 
Delphi 7 Professional
 
#5

Re: JVCL: TJvCreateProcess

  Alt 10. Mai 2006, 19:10
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-
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:25 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