AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

ShellExecuteEx + TerminateProcess

Ein Thema von shebang · begonnen am 22. Apr 2021 · letzter Beitrag vom 27. Apr 2021
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: ShellExecuteEx + TerminateProcess

  Alt 22. Apr 2021, 16:00
Das kann hinten und vorne nicht klappen.
Erstens machst du PostMessage mit einem Handle auf den Prozess. Man schickt aber Messages an ein Fensterhandle (HWND).

Zweitens interessieren sich Konsolenanwendungen herzlich wenig für Messages.

Ich bleibe dabei, ich sehe zwei Möglichkeiten:
1. Man verbindet sich mit der Konsole des gestarteten Prozesses und schickt ihm ein Ctrl+C mittels GenerateConsoleCtrlEvent

oder

2. Man packt das Ding in einem Job und wenn man es wirklich hart abschießenb will schließt man einfach den Job.


Ich nutze unter Windows die Jobs gerne, sie funktionieren zuverlässig und sind wirklich das Mittel der Wahl wenn man selbst gestartete Prozesse ordentlich und sicher verwalten will.
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
140 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: ShellExecuteEx + TerminateProcess

  Alt 22. Apr 2021, 17:37
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?
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: ShellExecuteEx + TerminateProcess

  Alt 22. Apr 2021, 18:36
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....
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.073 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: ShellExecuteEx + TerminateProcess

  Alt 23. Apr 2021, 09:03
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.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.555 Beiträge
 
Delphi 7 Professional
 
#5

AW: ShellExecuteEx + TerminateProcess

  Alt 23. Apr 2021, 09:51
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.
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
140 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: ShellExecuteEx + TerminateProcess

  Alt 23. Apr 2021, 15:53
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;
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: ShellExecuteEx + TerminateProcess

  Alt 26. Apr 2021, 17:12
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 :-]
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: ShellExecuteEx + TerminateProcess

  Alt 23. Apr 2021, 10:10
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.
Gruß vom KodeZwerg

Geändert von KodeZwerg (23. Apr 2021 um 10:17 Uhr) Grund: es ist freitag *gähn*
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: ShellExecuteEx + TerminateProcess

  Alt 23. Apr 2021, 14:03
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;
  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 02:20 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