![]() |
Win7: Problem mit Speichern von Daten in OnClose
Hallo,
ich verwende folgenden Code um mitzubekommen ob Windows runter gefahren wird, um dann noch Dateien zu speichern:
Delphi-Quellcode:
Also beim Schliessen werden im OnClose noch Dateien (Ini-Dateien, XML-Dateien) gespeichert.
{ ... }
private { Private-Deklarationen } Windows_Session_End : Boolean; procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QueryEndSession; public { Public-Deklarationen } end; { ... } procedure TMainForm.WMQueryEndSession(var Msg: TWMQueryEndSession); begin //Windows erlauben zu beenden Msg.Result := 1; //Wenn Windows beendet wird, dann Variable auf true setzen Windows_Session_End := true; inherited; end; procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin //Verbindung beenden //Inidatei schreiben //ListViews in "Monitor.xml" speichern end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin //Beenden erlauben/verweigern CanClose := Windows_Session_End or (MessageDlg(Msg1, mtConfirmation, [mbYes, mbNo], 0) = mrYes); end; Bei XP hat dies fehlerfrei funktioniert. Bei Win7 scheint es so, als würde mir Win7 den Boden unter den Füßen wegziehen und ich komm gar nicht mehr zum speichern. Jedenfalls hab ich keine gespeicherten Dateien. Muss man für Win7 etwas spezielles beachten? (Oder ich hab schon von vorn herein einen Fehler drin, der bei WinXP nicht auffiel) |
Re: Win7: Problem mit Speichern von Daten in OnClose
Seit Windows Vista ist der empfohlene Weg nicht mehr "Versuchen wir mal runterzufahren, wird sich schon wer melden wenns nicht passt" sondern "wer nicht will dass runtergefahren wird, soll das bitte vorher sagen" (hab ich zumindest jetzt do im Hinterkopf ...) ;)
http://msdn.microsoft.com/en-us/library/ms700677(VS.85).aspx |
Re: Win7: Problem mit Speichern von Daten in OnClose
Aber wenn ich deinen Satz richtig versteh, müsst ich ja verhindern dass Win7 runterfährt. Aber ich will ja wenn Win7 den Befehl rumschickt zum Runterfahren noch Daten speichern.
Oder hab ich was falsches verstanden? |
Re: Win7: Problem mit Speichern von Daten in OnClose
Oh, da hab ich dich wohl ein bisschen falsch verstanden :oops:
In dem Link sind auch Tabellen weil ein paar Timeout verkürzt wurden - aber die Message solltest ud eigentlich immernoch bekommen und speichern können :gruebel: Und wenn du einfach mal testweise den Shutdown abbrichst? Oder einfach mal so queryendsession&endsession an dein Programm schickst? Vll. kannst du so debuggen woran das liegt ;) |
Re: Win7: Problem mit Speichern von Daten in OnClose
Hast Du den verlinkten Artikel nicht gelesen? Kleiner Auszug:
Zitat:
|
Re: Win7: Problem mit Speichern von Daten in OnClose
Also wenn ich das richtig entziffere, dann muss das etwa so aussehen:
Delphi-Quellcode:
Nur steh ich gerade auf dem Schlauch: Wie kann ich die Funktionen "ShutdownBlockReasonCreate" und "ShutdownBlockReasonDestroy" von Delphi aus ansteuern?
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin // ShutdownBlockReasonCreate(Application.Handle, Format('%s speichert noch Dateien!', [Application.Title])); //Verbindung beenden //Inidatei schreiben //ListViews in "Monitor.xml" speichern // ShutdownBlockReasonDestroy(Application.Handle); end; [edit] so - nun hab ich den Aufruf hinbekommen:
Delphi-Quellcode:
Aber leider funktionierts trotzdem nicht...
function ShutdownBlockReasonCreate(HWND: hWnd; LPCWSTR: String): Boolean; stdcall;
external user32; function ShutdownBlockReasonDestroy(HWND: hWnd): Boolean; stdcall; external user32; Wenn ich den Eintrag bei MSDN richtig entziffere, dann müsste mit ShutDownBlockReasonCreate eine Meldung ausgeben mit dem Text den ich hinterlege, wenn meine Anwendung noch etwas braucht zum Runterfahren. Mit ShutDownBlockReasonDestroy müsste dann meine Anwendung diese Meldung rücksetzen damit Windows normal runterfahren kann. Aber es bleibt beim Alten - es wird nichts gespeichert und Win7 gibt keine Meldung aus |
Re: Win7: Problem mit Speichern von Daten in OnClose
Zitat:
|
Re: Win7: Problem mit Speichern von Daten in OnClose
Zitat:
Ich dachte es würde so funktionierten:
Delphi-Quellcode:
Aber das ergibt auch nicht den gewünschten Effekt.
procedure TMainForm.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin //Windows erlauben zu beenden Msg.Result := 0; //<-- jetzt null //Wenn Windows beendet wird, dann Variable auf true setzen Windows_Session_End := true; inherited; end; Hätte jemand vielleicht ein Delphi-Beispiel dafür? |
Re: Win7: Problem mit Speichern von Daten in OnClose
Und mir scheint, Du bist der Meister im Überlesen. Du musst zusätzlich zum WM_QUERYENDSESSION die ShutdownBlockReason...-Routinen benutzen. Es steht doch alles da, aber man muss sich halt durcharbeiten.
|
Re: Win7: Problem mit Speichern von Daten in OnClose
Zitat:
|
Re: Win7: Problem mit Speichern von Daten in OnClose
Woran liegt' s? Sollten es fehlende Englischkenntnisse sein, tut es mir Leid, das hättest Du mir dann sagen müssen.
|
Re: Win7: Problem mit Speichern von Daten in OnClose
Zitat:
Verständnis hat nichts mit Sprachkenntnissen zu tun - Verständnis kann auch Unwissenheit mit dem Umgang der Infos zu tun haben. Mir fehlt einfach momentan der Zusammenhang zwischen den einzelnen Infos und das daraus resultierende Umsetzen. Ich hoffe das war deutlicher? |
Re: Win7: Problem mit Speichern von Daten in OnClose
Das war nicht überheblich gemeint, sry dass das anscheinend so rüberkam. Du hast gesagt, Du verstehst den zitierten Text nicht und ich wollte nur wissen, was Du nicht verstehst. Aber zurück zum Thema: ich habe es selbst nicht versucht, aber verstehe das so, dass Du im WM_QUERYSESSION-Handler zusätzlich noch die entsprechende ShutdownBlockReason-Funktion aufrufen musst, damit Vista/Win7 sich wie gewollt verhalten.
[edit] Ich habe gerade ![]() |
Re: Win7: Problem mit Speichern von Daten in OnClose
Hi,
geht das nicht alles am Thema vorbei ? Er will doch nur richtig speichern, wenn Windows runtergefahren wird, und nicht dieses verhindern. Es gibt zu diesem Zweck 2 ( in Worten ZWEI ) Meldungen, die zu beachten sind. WM_QUERYENDSESSION holt die Erlaubnis ein herunterfahren zu können. Das Resultat ist nicht, dass heruntergefahren wird. WM_ENDSESSION erst meldet, wir fahren jetzt herunter, beeil dich mit dem Speichern. Das tritt nämlich nur ein, wenn nicht jemand etwas gegen das herunterfahren einzuwenden hatte. und jetzt kommts: Man kann sich dann nicht mehr darauf verlassen, dass OnClose aufgerufen wird (ist jedenfalls meine Erfahrung). Daher folgende Empfehlung: Erstelle eine Methode z.B. procedure ProgrammEnde, die alles macht, was du sonst in OnClose machen würdest. Rufe diese Methode in OnClose und in der Behandlung von WM_ENDSESSION auf. Merke dir in dieser Methode, dass du sie schon ausgeführt hast, damit sie nicht zweimal alles macht falls OnClose doch noch kommt. Diese Vorgehensweise habe ich in allen unseren Programmen auf dem Server, und das sind ca 20 Stück. Es funktioniert unter Win2k bis Win2k8 bestens, dann sollte das auch mit Win7 gehen, da Win2k8=Win7 Server. Viel Erfolg |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz