AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet wird
Thema durchsuchen
Ansicht
Themen-Optionen

CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet wird

Ein Thema von Bernhard Geyer · begonnen am 12. Mär 2014 · letzter Beitrag vom 19. Sep 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#1

CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet wird

  Alt 12. Mär 2014, 10:03
Über welche Option/Flag/Parameter kann ich steuern das mein gestarteter Child-Prozess automatisch beendet wird wenn der Hauptprozess beendet wird (z.B. Absturz Hauptanwendung - Childprozess sollte nicht mehr weiter laufen).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 12. Mär 2014, 10:13
Unter Windows gibt es da (im Gegensatz zu Unix) spontan nichts. Bei CreateProcess gibt es kein einfaches Flag, um so etwas zu erreichen.

Die einzige Lösung die ich kenne sind Jobs. Du kannst in deinem Parent-Prozess einen Job aufmachen, selbst dort als einziger hineinziehen und deine Kindprozesse dann auch dort drinnen aufmachen. Den Job kannst du dann so einstellen dass alle enthaltenen Prozesse terminiert werden wenn das letzte Handle auf den Job geschlossen wird. Da dein Parent der einzige mit einem Handle auf den Job ist, werden alle Kindprozesse terminiert wenn das Parent endet (kontrolliert oder Absturz).

Ich mache das bei mir so, funktioniert auch einwandfrei. Mich würde mal interessieren wie Anwendungen wie der Internet Explorer oder Google Chrome das lösen. Beide waren über ihre Multi-Prozess-Architektur anfangs total stolz und haben viele Blogbeiträge verfasst, vielleicht findet man da ja was.

Delphi bringt auch in der aktuellsten Fassung die Header-Files für die Job-Geschichte noch nicht mit, siehe hier.
Wenn du willst suche ich bei Gelegenheit nochmal alles zusammen was ich mache und stelle es rein.

War jedenfalls schon ein bisschen Arbeit wenn man damit noch nichts gemacht hatte und alle Eventualitäten abdecken will
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 12. Mär 2014, 11:46
Wenn du willst suche ich bei Gelegenheit nochmal alles zusammen was ich mache und stelle es rein.
Super Das wäre gut wenn man hier mal ein gute zusammenfassung hätte.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 12. Mär 2014, 15:06
Heute wird das knapp

Im Endeffekt ist es nicht viel:
Ein netter Forenbenutzer hatte sich schonmal die Arbeit gemacht, die notwendigen Header einzubinden.

Ich weiß nicht mehr, was ich daran noch herumgedoktert habe, aber im Anhang meine (schlimm anzusehende) Version.

Bei deinem Kindprozess gibst in CreateProcess bei den dwCreationFlags eventuell ein CREATE_BREAKAWAY_FROM_JOB an.

Anschließend kannst du sie mit AssignProcessToJobObject in deinem Job packen.


Das ist ungefähr so wie ich den Job angelegt habe:

Delphi-Quellcode:
const
   jobName: String = 'meinJob';
var
   errorCode: Cardinal;

   basicInfo: TJobObjectBasicLimitInformation;
   extInfo: TJobObjectExtendedLimitInformation;
begin

   // (1) Job-Objekt anlegen
   jobHandle := CreateJobObject(
      nil, // Das Handle kann nicht vererbt werden
      PWidechar(jobName)
   );

   if (jobHandle = INVALID_HANDLE_VALUE) or (jobHandle = 0) then begin
      errorCode := GetLastError();
      log('Konnte kein Job-Objekt erstellen. Fehlercode ' +
         IntToStr(errorCode) + ': ' + SysErrorMessage(errorCode), ltError);
      Exit;
   end;

   // Weitere interessante Job-Eigenschaften:
   // JOB_OBJECT_LIMIT_DIE_ON_UNHANDLED_EXCEPTION

   // (2) Eigenschaften setzen
   FillChar(basicInfo, SizeOf(basicInfo), 0);
   if terminatePluginsOnJobClose then
      basicInfo.LimitFlags := JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;

   FillChar(extInfo, SizeOf(extInfo), 0);
   extInfo.BasicLimitInformation := basicInfo;

   if not SetInformationJobObject(
      jobHandle,
      TJobObjectInfoClass.ExtendedLimitInformation,
      @extInfo,
      SizeOf(extInfo)
   )
   then begin
      errorCode := GetLastError();
      log('Konnte Eigenschaften des erstellten Job-Objekts NICHT setzen! Plugins werden'
        + 'möglicherweise nach unerwartetem Beenden des Hauptprogramms NICHT beendet!'
        + 'Fehlercode ' + IntToStr(errorCode) + ': ' +
        SysErrorMessage(errorCode), ltWarning);
   end;
end;
Angehängte Dateien
Dateityp: pas WinAPI_Job_Header.pas (5,8 KB, 16x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.620 Beiträge
 
Delphi 12 Athens
 
#5

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 12. Mär 2014, 15:46
@Günter: deklariere doch einmal die Records als packed und das "fragliche" Array als Array[0..0]. Behebt das die Probleme?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 12. Mär 2014, 17:31
Ich werde es bei nächster Gelegenheit ausprobieren und dich wissen lassen, danke

Nur warum [0..0] ? Die 25 waren von mir jetzt rein willkürlich gewählt. Ich erwarte schon, dass da mehr als nur eins zurückkommt...
Auch wenn es nur WinAPI-Header sind, die Unit ist wirklich peinlich
Irgendwann. Irgendwann mach ich das mal ordentlich
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.620 Beiträge
 
Delphi 12 Athens
 
#7

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 12. Mär 2014, 17:50
Hast Du den Link in meinem letzten Post übersehen? Da wird erklärt, was es mit dem 0..0 auf sich hat.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 12. Mär 2014, 17:53
Jepp, übersehen. Blöde Sonne knallt zu stark auf den Monitor
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.620 Beiträge
 
Delphi 12 Athens
 
#9

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 12. Mär 2014, 17:59
Einfach das Haus umdrehen
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 17. Apr 2014, 10:22
So, habs jetzt eingebaut. Funktioniert wie erwartet.


Deine HeaderUnit habe ich aber nicht benötigt sondern bin auf die Headerübersetzung der Jedi (JwaWinType, JwaWinNT, JwaWinBase) gegangen da diese eh schon verwendet werden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 10:29 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