![]() |
Kommandozeilen Programm innerhalb von Delphi
Ich möchte ein Kommandozeilen Programm, wie z.B. ping innerhalb von einem Delphi-Programm ausführen.
Das ganze soll so ähnlich wie cmd.exe sein. Also man startet ein Kommando-Zeilen Programm und dieses gibt etwas Zeile für Zeile aus. (Beim Beispiel von ping: Antwort ..., Antwort ..., Antwort ...) Das Programm aufrufen ist ja nicht das Problem, nur das, was passiert dann 'Live' wie im CMD anzuzeigen wird ist wohl das knifflige. Eine Mmöglichkeit wäre ja, das was im cmd passiert ist, als log in eine Datei umzuleiten und diese dann auslesen und anzeigen lassen. Aber das ist nicht das, was ich möchte. Es soll ja schon innerhalb von meinem Programm 'live' durchrattern. Eventuell die erzeugte Textdatei in einem kurzen Intervall immer wieder neu einlesen? Hat jemand noch eine andere und elegantere Idee parat? :) Grüße, Lorus |
Re: Kommandozeilen Programm innerhalb von Delphi
Du könntest die Ausgabe in eine NamedPipe umleiten. Näheres dazu findest du in der MS-SDK Doku.
Und falls du dir die (etwas verzwickte) Arbeit mit dem Pipe-Server nicht machen willst, kannst du auch die Komponente von ![]() |
Re: Kommandozeilen Programm innerhalb von Delphi
Eine named pipe hat damit nichts zu tun.
Die JCL ![]() Siehe JCL oder JVCL Installer die den Kommandozeilencompiler von Delphi auf diese Weise anzeigen. Das Problem ist hier auch in mindestens einem Thread breitgetreten worden. |
Re: Kommandozeilen Programm innerhalb von Delphi
Ich hatte ja gehofft, das jemand schonmal soetwas ähnliches vorhatte und erfolgreich umgesetzt hat.
Meine Kenntnisse (über Delphi/Programmierung) sind im Moment einfach viel zu gering um das eigenstängig umzusetzen. ![]() ![]() Trotzdem Danke für die Antworten :) Grüße, Lorus |
Re: Kommandozeilen Programm innerhalb von Delphi
hallo, ich hab hier mal ein Beispiel vor einiger Zeit gepostet:
![]() |
Re: Kommandozeilen Programm innerhalb von Delphi
das ist glaub ich genau das was ich suche :)
werde es, wenn ich wieder daheim bin mal testen :) Danke dir :) |
Re: Kommandozeilen Programm innerhalb von Delphi
Zitat:
|
Re: Kommandozeilen Programm innerhalb von Delphi
Es ist zwar eine Pipe aber keine named pipe sondern die klassische Unix Pipe ohne Namen.
Es koennte ja sonst nicht unter Win9x funktionieren wo es keine named pipes gibt. |
Re: Kommandozeilen Programm innerhalb von Delphi
Das ist genau das, was ich gesucht habe :)
Echt genial und tausend dank dir :) Noch eine kleine Frage dazu: Wenn ich
Delphi-Quellcode:
aufrufe, dann führt er den befehl ja aus und wartet bis das programm fertig ist. Was gibt die Funktion zurück wenn das Programm fertig ist? Das frage ich weil ich eventuell einen Timeout einbauen will, wenn das gestartet programm zu lange brauch um fertig zu werden.
FWriteToStdIn('befehl' + #13#10);
Grüße, Lorus |
Re: Kommandozeilen Programm innerhalb von Delphi
WriteToStdIn sollte eigentlich nicht warten sondern schreibt einfach in die Pipe was rein (kenn den Quelltext allerdings nicht auswendig und schließe anhand des Funktionsnamen darauf)
|
Re: Kommandozeilen Programm innerhalb von Delphi
habs ausprobiert
Delphi-Quellcode:
Ergebnis:
procedure TForm1.BtnWriteCmdClick(Sender: TObject);
begin FWriteToStdIn('ping google.de' + #13#10); FWriteToStdIn('ping google.de' + #13#10); end; google wird gepingt .. 4 antworten und anschließend wird google nochmal gepingt .. edit: Es ist gleich noch eine Frage aufgekommen :) Die Sonderzeichen die übergeleitet werden, werden in der Memobox nicht so wie im cmd dargestellt. Wie könnte man es erreichen, das das Memo den selben Zeichensatz verwendet, wie das cmd? :) |
DP-Maintenance
Dieses Thema wurde von "SirThornberry" von "Programmieren allgemein" nach "Windows API / MS.NET Framework API" verschoben.
|
Re: Kommandozeilen Programm innerhalb von Delphi
Huhu zusammen,
ich konkretisiere meine Fragen nochmal: 1) Wie ist der Zeichensatz von der DOS-Eingabeaufforderung? 2) Wie bringe ich den Zeichensatz am besten einem Memo bei? :) Grüße, Lorus |
Re: Kommandozeilen Programm innerhalb von Delphi
Dazu gibt es die Win32 Funktionen OemToChar, OemToChar, CharToOem und CharToOemBuff. Sie konvertieren C Strings zwischen den beiden Zeichensaetzen.
|
Re: Kommandozeilen Programm innerhalb von Delphi
Huhu,
erstmal danke für die Antwort :) Hab jetzt folgendes probiert:
Delphi-Quellcode:
bekomme nun aber Fehler das PAnsiChar und TString inkompatible Typen sind :-/
procedure TForm1.DosCommand1NewLine(Sender: TObject; NewLine: String;
OutputType: TOutputType); begin DosCommand1.OutputLines := OemToChar(Memo1.Lines); end; muss also jeder buchstabe einzeln umgewandelt werden? wie stelle ich das am besten an? :-) P.S. ich verwende jetzt die TDosCommand-Komponente |
Re: Kommandozeilen Programm innerhalb von Delphi
Huhu zusammen,
hab mir noch mal den Code von SirThornberry hergenommen, der gefällt mir im Prinzip auch besser als die TDosCommand-Kompo. Hab im Forum jetzt noch folgende Funktionen für Ascii --> Ansi Konvertierung gefunden und umgedreht.
Delphi-Quellcode:
function Ascii2Ansi(const s:AnsiString):AnsiString;
begin Result := s; if Result <> '' then begin UniqueString(Result); OemToChar(Pchar(Result), Pchar(Result)); end; end; function Ansi2Ascii(const s:AnsiString):AnsiString; begin Result := s; if Result <> '' then begin UniqueString(Result); CharToOem(Pchar(Result), Pchar(Result)); end; end; und hab das dann so in den Code eingebaut:
Delphi-Quellcode:
procedure TForm1.FClbProc(Sender: TObject; const ABuffer: String; ABufSize: Cardinal);
var LNew: String; LPos: Integer; begin LNew := copy(ABuffer, 1, ABufSize); LPos := pos(#$C, LNew); if (LPos > 0) then begin MemoOutput.Text := ''; LNew := copy(LNew, LPos + 1, Length(LNew)); end; MemoOutput.Text := Ansi2Ascii(MemoOutput.Text + LNew); PostMessage(MemoOutput.Handle, WM_VSCROLL, SB_BOTTOM, 0); end; Die Veränderung in der Zeile:
Delphi-Quellcode:
bringt aber leider nicht den gewünschten Erfolg :-/
MemoOutput.Text := Ansi2Ascii(MemoOutput.Text + LNew);
Habt ihr eine Idee, wie ich es richtig hinbekommen könnte? :) Grüße, Lorus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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