Entwickler-Ecke
Windows API - Programm unterbricht Windows-Shutdown
DELPHIn - So 23.06.02 15:30
Titel: Programm unterbricht Windows-Shutdown
Hallo,
ich stehe momentan vor einem großen Problem.
Mein Programm unterbricht den Windows-Shutdown.
Es handelt sich um eine kleine URL-Datenbank (
http://www.gwlinks.de).
Wenn Windows herunterfährt, soll nur die geöffnete Datenbank gespeichert werden, dann beendet sich das Programm, aber Windows fährt dann nicht weiter runter.
Irgendwann hat sich da wohl ein kleiner Fehler eingeschlichen.
Hat jemand eine Idee, woran das liegen könnte? Ich bin ratlos und weis nichtmal, wo ich suchen soll.
Vielen Dank
DELPHIn
Torsten - So 23.06.02 15:33
Moinsen!
Wahrscheinlich beendet Windows lediglich das Programm, jedoch nicht den Zugriff auf geöffnete Dateien oder DB's. Dabei kann es eventuell zu solchen Fehlern kommen.
Dein Programm muss also auf ein Windows-Shutdown reagieren und alle bestehenden Verbindungen schließen und sich selber sauber beenden.
Grüße
Torsten
DELPHIn - Mo 24.06.02 12:35
Mahlzeit!
Mein Prog reagiert schon auf die Shutdown-Message von Win und wenn nötig fordert es den User auf, die Datenbank zu speichern, aber dann geht es nicht weiter.
Momentan beende ich das Prog dann in der Messagebehandlung mit close und der User muß dann Win erneut herunterfahren, was aber sehr mißlich ist.
DELPHIn
DELPHIn - Mo 24.06.02 12:37
Ach ja, die Datenbank besteht einfach nur aus einem Textfile.
DELPHIn
eprees - Di 25.06.02 12:10
ne möglichkeit sollte doch auch sein selber nochmal das shutdown signal auszusenden ? ka ob das geht (sollte aber sicherlich, da diverse setup programme das immerhin auch können :) )
aber: wie haste denn den shutdown verhindert ? das finde ich viel interessanter :D
DELPHIn - Di 25.06.02 18:46
eprees hat folgendes geschrieben: |
ne möglichkeit sollte doch auch sein selber nochmal das shutdown signal auszusenden ? ka ob das geht (sollte aber sicherlich, da diverse setup programme das immerhin auch können :) )
aber: wie haste denn den shutdown verhindert ? das finde ich viel interessanter :D |
Ich reagiere auf die Windows-Message, die Windows an alle Programme im Falle eines Shutdown sendet.
Hier wird der User dann zum Speichern aufgefordert und das Prog gibt den Speicher frei usw.
Den Shutdown verhindern will ich aber auch garnicht, nur solange die Daten nicht gespeichert sind wäre das halt unvorteilhaft.
Ein Aufruf des Shutdownbefehls aus dieser Procedure hat keine Wirkung, warum weiß ich nicht, kann mir aber denken, dass sich das dann im Kreis drehen würde (der Shutdown würde ja wiederrum die Message auslösen).
overmoon - Mi 26.06.02 18:31
Wenn Windows den Computer herunterfahren will/soll,
sendet es an alle Programme, dass sie sich beenden sollen.
Weigert sich ein Programm,
(wenn z.B. im OnCloseQuery-Ereignis der Form der Var-Parameter CanClose auf false gesetzt wird)
bricht Windows das herunterfahren ab. So einfach ist das.
Möchte man den Computer aber herunterfahren muss das Programm vorher beendet sein,
d.h. zum Beispiel im Falle der Datenbank, dass sie zunächst geschlossen und das Programm beendet sein muss, dann kann man Windows über Start->Beenden erneut dazu auffordern herunterzufahren.
Das ist natürlich nicht sehr schön.
Das Ziel wäre ja, dass das Programm Windows mitteilt,
dass es sich jetzt herunterfahren kann, wenn
-> Das Programm seine letzten Aufgaben erfüllt sind und
-> Windows herunterfahren wollte.
Bevor Windows ein Program herunterfährt sendet es die Nachricht WM_ENDSESSION an das Programm.
Man muss also eine neue Prozedur einführen, die diese Nachricht auswertet und an dieser Stelle entsprechend reagiert.
Quelltext
1:
| procedure WMEndSession(var Msg:TWMEndSession); message WM_ENDSESSION; |
overmoon
Torsten - Mi 26.06.02 20:52
Angeblich reagiert er aber auf die Message.
So steht es jedenfalls ein paar Zeilen höher. So war ja auch mein Vorschlag.
Grüße
Torsten
DELPHIn - Do 27.06.02 18:34
Hi,
an overmoon:
Das OnCloseQuery-Ereignis werte ich aus, hier werden die Einstellungen in die Registry geschrieben, die Datenbank wenn nötig gespeichert und ggf. das Icon aus der Tray entfernt - CanClose setzte ich dabei aber nicht auf false.
Auf diese Message reagiert mein Prog schon wie beschrieben, die Message WM_ENDSESSION wird ausgewertet, hier sagt mein Prog dem User bisher, dass er den Windown nochmal runterfahren muß, ruft inherited auf und beendet sich mit close selbst.
Wenn ich close oder die ganze Messageauswertung weglasse beendet sich noch nichtmal das Programm.
Soll ich hier Win nochmal zum herunterfahren auffordern, bevor ich close aufrufe? Und wenn ja, wie?
Werd heute aben noch ein bischen probieren.
lolasoft - Mi 10.07.02 09:56
Es reicht nicht, dass sich das Programm schließt, denn Windows wartet solange, bis alle Programme gemeldet haben, das Sie zum ShutDown bereit sind, d.h.
Offiziell muss sich das Prog nicht beenden (ich mache es trotzdem immer), da Windows das übernimmt, aber das Prog muss Windows mitteilen, das es die Botschaft verstanden hat.
WM_EndSession und WM_QUERYENDSESSION (finde, das ist die bessere Alternative) fordern einen Rüdckgavbecode.
Der ResultCode für WM_ENDSESSION sollte 0 (Null) sein
Der ResultCode für WM_QUERYENDSESSION sollte 1 sein
message.Result := 1;
Lars
hitstec - Sa 13.07.02 05:06
Das Problem hatte ich auch. So habe ich es gelöst:
OnClose und WMQueryEndSession entahlten den exakten Code. Die Datenbank wird nämlich gesichert, Icon wird aus dem SysTray entfernt und zum Schluss wird das Programm terminiert:
Quelltext
1:
| Application.Terminate; |
PS: So sieht WMQueryEndSession aus:
procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;
Es scheint, dass mit dem Terminate Befehl, Windows so handelt, als ob das Programm beendet wurde.
hitstec - Di 23.07.02 22:45
Besser als
Quelltext
1:
| Application.Terminate; |
ist übrigens
Nach dem Übergeben dieses Befehls wird das Programm in "die Hände von Windows" übergeben d. h. Windows macht dann alles Notwendige, um das Programm zu beenden, oder so ähnlich.
Auf jedenfall funkts! 8)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!