Autor Beitrag
Delphi2015
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 09.01.15 20:13 
Hallo zusammen,

Habe ein kleines Programm zum Pingen gebastelt hier mal der Codeschnipsel:
ausblenden Delphi-Quelltext
1:
2:
3:
procedure TForm1.Button1Click(Sender: TObject);
begin
 ShellExecute(0,'Open', PChar('ping'),PChar(Edit1.Text),nil,SW_SHOWNORMAL);

1.Ich würde gerne noch 2 Parameter an die Konsole Übergeben die an die eingetragene IP angehängt werden (-t -l).
Hab versucht sie im string zu übergeben was nicht funktioniert hat auch mit Pchar bekomm ichs nicht geregelt.

2.Wie behalte ich die Konsole offen denn diese schliesst sofort nach ausgeführtem Ping. Ich hab mal irgendwas von einem Parameter /K gelesen den ich mit übertrage der sie offen hält ?

Kann mir jemand helfen ?

Danke schon mal.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 09.01.15 20:50 
Hallo und :welcome:

Die Parameter musst du eigentlich nur an den Inhalt von Edit1 hängen. Es wäre sinnvoll gewesen, wenn du gezeigt hättest wie du es versucht hast, dann könnte man dir auch erklären warum das nicht geht.
Richtig ist es so: PChar(Edit1.Text + ' -t -l')
Du baust zuerst den Delphi-String zusammen und castest dann auf PChar um den Wert zu übergeben.

Um eine Konsole offen zu halten musst du auch die Konsole starten, sprich die cmd.exe. Der kannst du dann übergeben, dass sie den Befehl ping aufrufen soll und da funktioniert auch /k.

Du kannst aber auch die Ausgabe einfach in deinem Programm abfangen und anzeigen. Mit GetConsoleOutput solltest du etwas finden.
Delphi2015 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 09.01.15 21:00 
ausblenden Delphi-Quelltext
1:
PChar(Edit1.Text + ' -t -l')					

So hab ichs auch versucht und ist aktuell auch so, Programm lässt sich starten keine Fehlermeldungen wenn ich dann den Button drücke flackert die Konsole kurz auf und schliesst sofort wieder.

Moderiert von user profile iconNarses: Beiträge zusammengefasst

ausblenden Delphi-Quelltext
1:
ShellExecute(Handle, 'open', PChar('cmd.exe'), PChar('/k ping'), PChar(Edit1.Text + ' -t -l'),  nil, SW_SHOW);					

Habs mal so Versucht, kommt aber die Fehlermeldung:

[Error] Unit1.pas(29): Incompatible types: 'Integer' and 'Pointer'

Wie oft kann ich denn eigentlich PChar anwenden?
Wenn ich das richtig verstanden habe übergibt PChar einfach nur Parameter, also könnte man das x beliebig mal anwenden oder ?

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 09.01.15 23:15 
Moin und :welcome: im Forum!

Mal ne andere Frage: warum muss es denn unbedingt eine Konsole sein? :gruebel: Man kann von Delphi aus die ICMP-Echo-API auch direkt ansprechen. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 10.01.15 07:30 
user profile iconDelphi2015 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
ShellExecute(Handle, 'open', PChar('cmd.exe'), PChar('/k ping'), PChar(Edit1.Text + ' -t -l'),  nil, SW_SHOW);					

Habs mal so Versucht, kommt aber die Fehlermeldung:

[Error] Unit1.pas(29): Incompatible types: 'Integer' and 'Pointer'
Siehst du, mit Quelltext lässt sich auch sagen was eigentlich dein Problem an der Stelle ist. ;-)
Hier findest du die Doku zu ShellExecute:
msdn.microsoft.com/e...53%28v=vs.85%29.aspx
Du siehst dort (in Delphi selbst ja auch) die Funktionsparameter.

Für die Kommandozeilenparameter gibt es dort einen einzigen Funktionsparameter. Du hast hier aber die Kommandozeilenparameter auf zwei verschiedene Funktionsparameter aufgeteilt. Damit übergibst du PChar(Edit1.Text + ' -t -l') als Arbeitsverzeichnis und nil als Anzeigekommando (aber die Typen sind nicht kompatibel, nil ist ein Pointer, der Funktionsparameter aber ein Integer). Und danach ist ein Funktionsparameter zu viel.

Richtig sieht es so aus:
ausblenden Delphi-Quelltext
1:
ShellExecute(Handle, 'open', PChar('cmd.exe'), PChar('/k ping ' + Edit1.Text + ' -t -l')nil, SW_SHOW);					

So packst du alle Kommandozeilenparameter für die cmd.exe in einen Funktionsparameter als PChar und übergibst alles in diesem einen Funktionsparameter.

ABER der Aufruf des ping Befehls ist noch falsch. -l gibt die Größe des Sendebuffers an, diese fehlt dahinter aber noch.

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Mal ne andere Frage: warum muss es denn unbedingt eine Konsole sein? :gruebel: Man kann von Delphi aus die ICMP-Echo-API auch direkt ansprechen. :idea:
Deinen entsprechenden Thread mit Unit + Demo hättest du ja ruhig auch gleich verlinken können: :D
www.entwickler-ecke....iewtopic.php?t=53259
Delphi2015 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 10.01.15 11:01 
Super, so funktionierts !

Vielen Dank :zustimm:

Den Puffer trage ich noch ein.