AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ShellExecuteEx + TerminateProcess

Ein Thema von shebang · begonnen am 22. Apr 2021 · letzter Beitrag vom 27. Apr 2021
Antwort Antwort
Seite 2 von 3     12 3      
shebang

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

AW: ShellExecuteEx + TerminateProcess

  Alt 22. Apr 2021, 17:33
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.
  Mit Zitat antworten Zitat
shebang

Registriert seit: 7. Feb 2020
97 Beiträge
 
Delphi 11 Alexandria
 
#12

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.685 Beiträge
 
Delphi 11 Alexandria
 
#13

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
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#14

AW: ShellExecuteEx + TerminateProcess

  Alt 23. Apr 2021, 02:50
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

Geändert von Dalai (23. Apr 2021 um 12:38 Uhr) Grund: Typo
  Mit Zitat antworten Zitat
TiGü

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

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.415 Beiträge
 
Delphi 7 Professional
 
#16

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
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#17

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.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

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
shebang

Registriert seit: 7. Feb 2020
97 Beiträge
 
Delphi 11 Alexandria
 
#19

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.685 Beiträge
 
Delphi 11 Alexandria
 
#20

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
Antwort Antwort
Seite 2 von 3     12 3      


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 22:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz