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?