AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Cmd in eine Delphi-Applikation integrieren?

Ein Thema von DelphiCreak · begonnen am 4. Aug 2010 · letzter Beitrag vom 6. Aug 2010
Antwort Antwort
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 4. Aug 2010, 20:54
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;
Angehängte Dateien
Dateityp: pas unConsoleRedirector.pas (13,3 KB, 44x aufgerufen)

Geändert von Namenloser ( 4. Aug 2010 um 20:58 Uhr)
  Mit Zitat antworten Zitat
DelphiCreak

Registriert seit: 3. Sep 2008
51 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 4. Aug 2010, 21:08
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.
Dominik C.
Orientierungslos sieht man mehr vom Leben.

Geändert von DelphiCreak ( 4. Aug 2010 um 21:32 Uhr)
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#3

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 4. Aug 2010, 21:51
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
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 5. Aug 2010, 01:29
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.
Ich bin mir zwar nicht sicher, was du damit meinst, aber es soltle eigentlich egal sein, ob das Programm Eingaben entgegennimmt oder nicht.

Wie startest du das Programm denn? Startest du es über Start('programm.exe') oder über Start('cmd /K programm.exe') ? 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.

Falls das auch nicht klappt, nutzt das Programm wahrscheinlich keine der Standard-Ausgabefunktionen.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#5

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 5. Aug 2010, 05:10
Oder man macht es so wie hier.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 5. Aug 2010, 05:56
Oder man macht es so wie hier.
Es ist nicht zu empfehlen, den Umweg über eine temporäre Datei zu gehen. Das erzeugt nur unnötige Festplattenabnutzung und bremst zudem die Ausgabe aus, da die Festplatte erheblich langsamer ist als der Arbeitsspeicher. Außerdem bekommt man den Inhalt so erst, wenn der Prozess beendet ist.

[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]

Geändert von Namenloser ( 5. Aug 2010 um 06:02 Uhr)
  Mit Zitat antworten Zitat
DelphiCreak

Registriert seit: 3. Sep 2008
51 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 5. Aug 2010, 17:00
@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?
Dominik C.
Orientierungslos sieht man mehr vom Leben.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 5. Aug 2010, 17:03
@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?
Du rufst die exe von der cmd aus auf und hängt ein > datei.txt an.
Code:
programm.exe > datei.txt
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 5. Aug 2010, 17:46
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?
Sorry, den Post habe ich irgendwie überlesen.

Zu 1.: Sollte möglich sein, wenn du in der Methode TConsoleRedirector.StartProcess in der Zeile StartupInfo.wShowWindow := SW_HIDE; SW_HIDE durch SW_SHOW ersetzt.

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 private - oder public -Abschnitt.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#10

AW: Cmd in eine Delphi-Applikation integrieren?

  Alt 5. Aug 2010, 17:13
Es ist nicht zu empfehlen, den Umweg über eine temporäre Datei zu gehen. Das erzeugt nur unnötige Festplattenabnutzung...
Das mit der Festplattenabnutzung ist jetzt aber nicht Dein Ernst.
... bremst zudem die Ausgabe aus, da die Festplatte erheblich langsamer ist als der Arbeitsspeicher. Außerdem bekommt man den Inhalt so erst, wenn der Prozess beendet ist.
Nur er hat ja nicht so richtig beschrieben, ob er nur das Ergebnis haben möchte oder den Ablauf 1:1 wie es in der Eingabeaufforderung auftaucht.

[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]
Das mag ja sein, ich wollte halt auch nur eine andere Variante aufzeigen wie es geht.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort

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 10:23 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