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
 
Der schöne Günther

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

AW: CreateProcess und gestarteten Prozess automatisch beenden wenn Anwendung beendet

  Alt 12. Mär 2014, 14: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
 


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 18:23 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