Autor Beitrag
DELPHIn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Windows Vista
Delphi 2007 für Win 32 Prof.
BeitragVerfasst: So 23.06.02 15:30 
Hallo,

ich stehe momentan vor einem großen Problem.
Mein Programm unterbricht den Windows-Shutdown.
Es handelt sich um eine kleine URL-Datenbank (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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 160



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Windows Vista
Delphi 2007 für Win 32 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Windows Vista
Delphi 2007 für Win 32 Prof.
BeitragVerfasst: Mo 24.06.02 12:37 
Ach ja, die Datenbank besteht einfach nur aus einem Textfile.

DELPHIn
eprees
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Windows Vista
Delphi 2007 für Win 32 Prof.
BeitragVerfasst: 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).

_________________
DELPHIn
=> Errare humanum est
overmoon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 16



BeitragVerfasst: 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.
ausblenden Quelltext
1:
procedure WMEndSession(var Msg:TWMEndSession); message WM_ENDSESSION;					


overmoon
Torsten
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 160



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Windows Vista
Delphi 2007 für Win 32 Prof.
BeitragVerfasst: 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.

_________________
DELPHIn
=> Errare humanum est
lolasoft
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: Di 23.07.02 22:45 
Besser als

ausblenden Quelltext
1:
Application.Terminate;					

ist übrigens

ausblenden Quelltext
1:
halt(1);					

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)