Einzelnen Beitrag anzeigen

Der schöne Günther

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

Windows tötet Delphi-Anwendung noch vor Unit-Finalisierung

  Alt 23. Dez 2015, 20:08
Es geht um das Herunterfahren bzw. Abmelden des Benutzers. Ich stelle hier grade fest dass beim Herunterfahren Code im finalization -Abschnitt einer Unit nicht ausgeführt wird. Wenn ich das Herunterfahren "fälsche" indem ich mir selbst einfach eine WM_ENDSESSION -Nachricht schicke beendet sich die VCL-Anwendung zwar auch, führt aber auch ordentlich alles im finalization-Abschnitt aus.

Mein kompletter Code sieht folgendermaßen aus:

Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin
   Application.HookMainWindow(wndProcHook);
end;

function TForm3.wndProcHook(var message: TMessage): Boolean;
begin
   Result := false;
   case message.Msg of
      WM_ENDSESSION: begin
         placefile('ZZzzz 1');
         sleep(5000);
         placefile('ZZzzz 2');
         Halt(0);
      end;
   end;
end;

initialization
finalization
   placeFile('unit finalization');
end.
placeFile(..) legt nur eine leere Datei im gleichen Verzeichnis wie die exe an.

Wenn ich das Herunterfahren "fälsche" erhalte ich die drei Dateien "ZZzzz 1", "ZZzzz 2" und "unit finalization". Melde ich mich richtig ab, fehlt das "unit finalization" einfach.

Ich habe keine Ahnung wie ich das debuggen könnte. Meine Vermutung: Irgendeine Unit-Finalisierung der VCL ist vor meiner dran. Dort drin werden wohl weiter kurz Messages abgearbeitet. Das ist tödlich, denn Windows nimmt so etas nach einem WM_ENDSESSION zum Anlass das Programm direkt abzuschießen.

Siehe hier: Once you return from the WM_ENDSESSION message, your process can be terminated at any time.


Es ist eine schwache Vermutung, aber die einzige die ich habe. Mein Ziel ist es, dass die Finalisierung aller Units ausgeführt wird und Windows meine Anwendung nicht vorher abschießt. Kann mir jemand helfen?
  Mit Zitat antworten Zitat