Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   ShellExecuteEx + TerminateProcess (https://www.delphipraxis.net/207684-shellexecuteex-terminateprocess.html)

shebang 22. Apr 2021 17:33

AW: ShellExecuteEx + TerminateProcess
 
Das hatte ich auch schon probiert, aber scheinbar weiß die ping.exe nicht, was sie mit dem ">" anfangen soll und beendet sich sofort beim Aufruf. So wie ich es verstanden habe ist die Umleitung mittels ">" eine Funktionalität der Konsole.

shebang 22. Apr 2021 17:37

AW: ShellExecuteEx + TerminateProcess
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1487632)
Man packt das Ding in einem Job und wenn man es wirklich hart abschießenb will schließt man einfach den Job.

Hast du zufällig einen Link zu einem Bespiel, wie man das in Delphi löst?

KodeZwerg 22. Apr 2021 18:36

AW: ShellExecuteEx + TerminateProcess
 
nur mal eine frage so am rande, geht es wirklich um "ping.exe" oder andere CLI anwendungen?

ping kann man ja per indy und konsorten auch ohne CLI haben, unsichtbar im hintergrund, auswerten und schreiben in eine datei etc....

Dalai 23. Apr 2021 02:50

AW: ShellExecuteEx + TerminateProcess
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1487641)
Wieso nicht?

Weil die CMD (oder PowerShell oder Terminal oder was auch immer) sich um die Umleitungen kümmert, nicht jedes Konsolenprogramm selbst. Letzteres weiß gar nichts von Umleitungen sondern nur von StdIn, StdOut und StdErr.

@shebang:
Werden denn selbstgeschriebene Konsolenprogramme ausgeführt? Wenn ja, dann würde ich das Konzept überdenken und die Programme entsprechend der Anforderungen anpassen. Prozesse töten sollte immer einer der letzten Wege sein.

Grüße
Dalai

TiGü 23. Apr 2021 09:03

AW: ShellExecuteEx + TerminateProcess
 
Zitat:

Zitat von KodeZwerg (Beitrag 1487653)
nur mal eine frage so am rande, geht es wirklich um "ping.exe"

Ne, das geht meiner Ansicht nach aber aus den ersten Sätzen des Eröffnungsposts hervor.

Delphi.Narium 23. Apr 2021 09:51

AW: ShellExecuteEx + TerminateProcess
 
Frag' bitte mal die Suchmaschine Deiner Wahl nach createprocess with pipe site:delphipraxis.net. Da sollten ein paar brauchbare Ansätze zu finden sein. Momentan kann ich aber nicht entscheiden, welcher der für Dich Richtige ist.

Der beste Ansatz ist vermutlich hier zu finden: https://www.delphipraxis.net/169697-...t-ausgabe.html, allerdings kann ich dort nicht erkennne, wie dort der gestartete Prozess beendet werden kann.

KodeZwerg 23. Apr 2021 10:10

AW: ShellExecuteEx + TerminateProcess
 
Zitat:

Zitat von TiGü (Beitrag 1487670)
Zitat:

Zitat von KodeZwerg (Beitrag 1487653)
nur mal eine frage so am rande, geht es wirklich um "ping.exe"

Ne, das geht meiner Ansicht nach aber aus den ersten Sätzen des Eröffnungsposts hervor.

Dann könnte man (weil ich keine ahnung von jobs habe) als workaround eine prozess liste (Hier im Forum suchenTlHelp32) anfertigen bevor man das ganze startet.
Nachdem es gestartet wurde noch eine liste anfertigen.
Prozessliste nach "CLIname.exe" (ping.exe) bei den neu dazugekommenen durchforsten und PID merken.
Bei abbruch dann zuerst die PID abschießen anschließend die CLI von der du ja bereits das handle kennst.
(In manchen situationen ändert sich das handle allerdings, das sollte man im hinterkopf haben)

Wenn es wiederum doch nur ums pingen geht würde ich komplett auf CLI verzichten und per MSDN-Library durchsuchenIcmpSendEcho oder Hier im Forum suchenTIdStackWindows abfragen/auswerten/speichern solange wie man es halt benötigt.

Der schöne Günther 23. Apr 2021 14:03

AW: ShellExecuteEx + TerminateProcess
 
Zitat:

Zitat von shebang (Beitrag 1487648)
Hast du zufällig einen Link zu einem Bespiel, wie man das in Delphi löst?

Ja, Sourcecode (2 Dateien) sind hier. Die Header hatte ich hiervon übernommen.

Benutzung ist folgendermaßen:
Delphi-Quellcode:
var
   windowsJob: TJobObject;
   shellExecuteInfo: TShellExecuteInfo;   
begin
   (...)
   windowsJob := TJobObject.Create();
   ShellExecuteEx(shellExecuteInfo);
   windowsJob.moveProcessTo(shellExecuteInfo.Handle);
end;

shebang 23. Apr 2021 15:53

AW: ShellExecuteEx + TerminateProcess
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1487672)
Der beste Ansatz ist vermutlich hier zu finden: https://www.delphipraxis.net/169697-...t-ausgabe.html, allerdings kann ich dort nicht erkennne, wie dort der gestartete Prozess beendet werden kann.

Vielen Dank, das hat mich zu meiner Lösung gebracht. Mir war nicht bewusst, dass man über die Pipes von CreateProcess auch eine Datei angeben kann. Es funktioniert jetzt genau so wie ich es mir vorgestellt habe.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  StartupInfo : TStartupInfo;
  SecAttr    : TSecurityAttributes;
  command    : string;
  filename   : string;
begin
  command := 'ping.exe -t delphipraxis.net';
  filename := 'D:\output.txt';

  ZeroMemory(@SecAttr, SizeOf(TSecurityAttributes));
  SecAttr.nLength       := SizeOf(SecAttr);
  SecAttr.bInheritHandle := True;
  fileHandle            := CreateFile(PChar(filename), GENERIC_WRITE, FILE_SHARE_WRITE, @SecAttr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

  ZeroMemory(@StartupInfo, SizeOf(TStartupInfo));
  StartupInfo.cb         := SizeOf(TStartupInfo);
  StartupInfo.hStdOutput := fileHandle;
  StartupInfo.dwFlags    := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_HIDE;

  CreateProcess(nil, PChar(command), nil, nil, TRUE, 0, nil, nil, StartupInfo, ProcessInfo);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  TerminateProcess(ProcessInfo.hProcess, 0);
  CloseHandle(fileHandle);
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(ProcessInfo.hProcess);
end;

KodeZwerg 26. Apr 2021 17:12

AW: ShellExecuteEx + TerminateProcess
 
Schade das shebang Kommunikation mit mir vermeidet, sonst hätte ich meine timer-basierte CLI freie Lösung mal zeigen können, da es sich bis zum Ende ja doch nur um Ping gehandelt hat oder es war alles nur exemplarisch und ich bin schwer von begriff :-]


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Seite 2 von 3     12 3      

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