Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
4.911 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, 8x aufgerufen)
  Mit Zitat antworten Zitat