Einzelnen Beitrag anzeigen

Der schöne Günther

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

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

  Alt 24. Dez 2015, 10:23
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".

Geändert von Der schöne Günther (24. Dez 2015 um 11:58 Uhr)
  Mit Zitat antworten Zitat