Hört sich an wie eine Darmerkrankung
// 1. Update
Und mein Verdacht erhärtet sich! Wenn ich in meinem
WM_ENDSESSION
das Hauptformular abbaue, wird die Anwendung von Windows gekillt. Er scheint wirklich zu meinen "
So, sind ja alle Fenster weg, können wir hier ja zumachen". Ein einfaches Form1.Destroy() reicht schon, alles danach wird nicht mehr ausgeführt!
Was ist nun wenn wir das Hauptformular nicht zerstören? Wie
Raymon Chen schon sagte:
Zitat:
Besides, why spend your time closing windows when the session is about to go away anyway? Ooh, let me clean up this and destroy that, I know you asked to shut down, but this’ll just take a few seconds. It’s like taking the time to steam-clean the rugs before you demolish the building. Wasted effort.
Mein QuickFix sieht so (schlimm) aus:
Delphi-Quellcode:
destructor TForm1.Destroy;
begin
if (Application.MainForm = self) then
// do nothing
else
inherited;
end;
Was geschieht dann? Alles was ich möchte. Die Anwendung wird ordentlich beendet, die Dinge im finalization-Abschnitt der
Unit werden ausgeführt und der Klassendestruktor auch. War es doch so einfach?
// 2. Update
Und die Bestätigung ist wohl auch da. Die Anwendung geht reproduzierbar tot wenn ich beim Herunterfahren nur sage
WinApi.Windows.DestroyWindow(Form1.Handle);
Tja, die
Doku zu WM_ENDSESSION sagte
Zitat:
The application need not call the DestroyWindow or PostQuitMessage function when the session is ending.
"Need not call" ist nach meinem Englisch "muss nicht".
Hätte ich Idiot ausnahmsweise mal die Kommentare auf der
MSDN-Seite weiter unten geleasen. Ein werter Herr bestätigt exakt meine Erlebnisse:
Zitat:
The documentation says you need not call DestroyWindow() inside your WM_ENDSESSION handler, but in my experience you *must* not call DestroyWindow(). Otherwise, the system might nuke your process before DestroyWindow() returns.
Das ist es also. Was wäre nun ein ordentliches Ende für diese Odyssee? Ich tue mich schwer auf eine konkrete Stelle im
VCL-Code zu zeigen und zu sagen "Das sollte anders gemacht werden".