![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:48 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