![]() |
Cmd in eine Delphi-Applikation integrieren?
Guten Abend liebe DP,
ich bin im Moment auf der Suche nach einer simplen Möglichkeit, die Ausgabe von cmd.exe basierten Anwendungen auszulesen und z.b. in einem Memo auf meiner eigenen Applikation auszugeben. Ist dies überhaupt möglich, und wenn ja, wie? Edit: Dank Delphi-Treff habe ich jetzt den Code, um die Ausgabe der cmd.exe abzufangen. Das Problem jetzt: wie bekomme ich die Ausgabe einer .exe, die im Konsolenfenster startet, in die normale cmd um diese dann auszulesen? Vielen Dank im Vorraus |
AW: Cmd in eine Delphi-Applikation integrieren?
Liste der Anhänge anzeigen (Anzahl: 1)
Es gibt einige Lösungen dazu im Netz, die meist aber erst das Ergebnis zurückliefern, wenn die Anwendung beendet wurde.
Wenn dir das nicht reicht, kannst du meine Klasse aus der Unit im Anhang benutzen. Sie stellt Events bereit, die aufgerufen werden, wenn neue Daten ankommen. Beispiel:
Delphi-Quellcode:
type
TMyForm = class(TForm) ... protected FRedirector: TConsoleRedirector; procedure MyEventHandler(Sender: TObject; const Data: string); end; procedure TMyForm.MyEventHandler(Sender: TObject; const Data: string); begin Memo1.Text := Memo1.Text+Data; end; procedure TMyForm.FormCreate(...); begin FRedirector:= TConsoleRedirector.Create; FRedirector.OnReadOutput := MyEventHandler; end; procedure TMyForm.MyButtonClick(...); begin FRedirector.Start('cmd /K ping google.com'); end; |
AW: Cmd in eine Delphi-Applikation integrieren?
Vielen Dank NamenLozer für diese Klasse, ist nochmal geordneter als der Quelltext den ich auf Delphi-Treff gefunden habe. Löst allerdings mein Problem noch nicht ganz.
Ich kann damit zwar ausgaben von anwendungen abfangen, die z.b. auf batch-skripten basieren. Was mir vorliegt ist jedoch eine Kompilierte .exe (Ich weiß leider nicht genau, was für eine Anwendung dies ist), die ihre Ausgaben in einem Konsolenfenster schreibt. Ich möchte diese Auslesen, und dafür müsste ich diese .exe eigentlich direkt in der cmd starten, ohne ein neues Fenster zu starten etc. Was ich im moment suche ist ebendieser Befehl. Edit: mit TDosCommand komm ich zwar an die entsprechende Ausgabe, jedoch erst nach beenden des Programms - für mich ist es jedoch wichtig, die Ausgabe auch während der Laufzeit mitzuloggen Edit2: Mit deiner Lösung kann ich das entsprechende Programm zumindest starten, die Ausgaben werden jedoch nicht korrekt mitgeloggt. Vielleicht liegt das daran, dass mein Programm keine aktive Zeile hat, in der der Benutzer Eingaben tätigen kann, sondern ein reines Ausgabeprogramm ist. |
AW: Cmd in eine Delphi-Applikation integrieren?
Wenn das externe Programm nur etwas ausgibt, kannst du dieses doch auch so starten, dass es die Ausgabe nicht auf die Konsole ausgibt, sondern z.B. in eine Textdatei, die du dann mit deinem Programm (zyklisch) auswerten kannst:
bla.exe > log.txt |
AW: Cmd in eine Delphi-Applikation integrieren?
Zitat:
Wie startest du das Programm denn? Startest du es über
Delphi-Quellcode:
oder über
Start('programm.exe')
Delphi-Quellcode:
? Falls du es nicht schon so machst, versuch es mal mit der 2. Variante, ich meine, ich hätte schon mal damit Erfolg gehabt, als es direkt nicht funktionieren wollte.
Start('cmd /K programm.exe')
Falls das auch nicht klappt, nutzt das Programm wahrscheinlich keine der Standard-Ausgabefunktionen. |
AW: Cmd in eine Delphi-Applikation integrieren?
Oder man macht es so wie
![]() |
AW: Cmd in eine Delphi-Applikation integrieren?
Zitat:
[edit] Und wenn du meinen Code mal mit dem von dir verlinkten vergleichst, wirst du feststellen, dass beide fast identisch sind, nur dass ich mir den Umweg über die Datei spare und stattdessen direkt in eine Pipe umleite, die ich dann auslese. [/edit] |
AW: Cmd in eine Delphi-Applikation integrieren?
@NamenLozer: Auch der Parameter /K erbringt nicht den gewünschten Erfolg. Der entsprechende Task wird zwar dann im Task-Manager angezeigt, doch die mein Ausgabefeld bleibt immer noch leer. Gibt es eine Möglichkeit bei deiner Unit, die Konsole sichtbar zu starten? Um zu überprüfen was denn in dieser steht?
Und ich bekomme bei deinem Script die Meldung, dass FRedirector keine entsprechende Komponente besitzt und ob die Deklaration entfernt werden solle. Lässt sich dieser Fehler vermeiden? @blackfin: Und wie leite ich dies um? Ich habe keinen Quelltext, nur eine fertig kompilierte .exe. Wie kann ich die Ausgabe von dieser in eine Datei umleiten? |
AW: Cmd in eine Delphi-Applikation integrieren?
Zitat:
Delphi-Quellcode:
an.
> datei.txt
Code:
programm.exe > datei.txt
|
AW: Cmd in eine Delphi-Applikation integrieren?
Danke NamenLozer, probier ich gleich mal aus und melde dann obs funktioniert
[edit] Er legt eine datei.txt an, in dieser stehen jedoch keinerlei Ausgaben. Die Ausgaben erscheinen wieder erst, wenn meine programm.exe geschlossen wird. Während der Laufzeit bleibt das ganze unsichtbar. Und über Delphi wird die Datei anscheinen nichteinmal angelegt, mit keinem meiner momentanen 3 Versuche :D [/edit] |
AW: Cmd in eine Delphi-Applikation integrieren?
Ich möchte mal diesen Thread in den Raum werfen:
![]() |
AW: Cmd in eine Delphi-Applikation integrieren?
Zitat:
Zitat:
Zitat:
|
AW: Cmd in eine Delphi-Applikation integrieren?
Ich habe gerade in einem anderem Forum gefunden, dass erst eine gewisse Buffergröße erreicht werden muss, bevor die Ausgabe auf der Festplatte geschieht. Weiß jemand von euch einen weg, das zu umgehen? Oder erstmal ob da mein Problem liegt? :D
Danke für die bisherige Hilfe schonmal |
AW: Cmd in eine Delphi-Applikation integrieren?
Zitat:
Zu 1.: Sollte möglich sein, wenn du in der Methode
Delphi-Quellcode:
in der Zeile
TConsoleRedirector.StartProcess
Delphi-Quellcode:
StartupInfo.wShowWindow := SW_HIDE;
Delphi-Quellcode:
durch
SW_HIDE
Delphi-Quellcode:
ersetzt.
SW_SHOW
Zu 2.: Ich vermute, du hast FRedirector in der Klassendefinition in dem gleichen Abschnitt deklariert, wo die ganzen Komponenten aufgelistet sind? Verschieb sie mal in den
Delphi-Quellcode:
- oder
private
Delphi-Quellcode:
-Abschnitt.
public
|
AW: Cmd in eine Delphi-Applikation integrieren?
Vielen Dank, die beiden kleineren Probleme sind gelöst :D
Auch deine Funktion liefert die Ausgabe ins Memo-Feld erst, wenn das Programm beendet wird. (Konnte ich vorher nicht, da das Programm an einer bestimmten Stelle auf etwas wartet.) Irre ich mich, oder gibt es bei deiner Version keine Möglichkeit, die Ausführung der cmd so zu beenden wie über das normale "Schließen"? Alles was ich finden kann sind Terminate und Destroy, welche beide die Ausgabe am Ende nicht erreichen. |
AW: Cmd in eine Delphi-Applikation integrieren?
Sollte eigentlich mit Terminate gehen. Kann ich nachher mal testen...
|
AW: Cmd in eine Delphi-Applikation integrieren?
Ich habe jetzt im Moment 3 Möglichkeiten:
Mit der Komponente DosCommand (die 2009er-Version aus dem Thread, der oben von DeddyH verlinkt wurde) Mit der Unit unConsoleRedirector von Namenlozer und die Funktion GetConsoleOutput. Alle 3 liefern mir die Ausgabe erst, wenn das Programm beendet wurde, und auch nur, wenn ich das Fenster sichtbar starte und dann über "Schließen" die Konsole wieder schließe. Mit dem DosCommand-Befehl "Stop" wird zwar das Programm beendet, die Ausgabe jedoch nicht übergeben. Bei anderen cmd-Programmen wir "ping www.google.de" funktionieren alle 3 Möglichkeiten tadellos, nur bei meinem Programm anscheinend nicht. Fällt irgendjemandem etwas ein, woran das liegen könnte? Mein Programm kompiliert ein in Phyton geschriebenes Programm und startet dieses dann. Alles bleibt jedoch im Fenster der cmd. Beim normalen Starten sieht man die Ausgabe, und wie gesagt, bei normalem Beenden des Programms kommt die Ausgabe nicht über. Nur nicht zur Laufzeit -.-" um auf RWarnecke zurückzukommen: Es wäre schön, wenn jede Zeile direkt zur Laufzeit überkommen würde. Eben wenn sie auch im cmd-Fenster erscheint. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 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