Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Win7: Problem mit Speichern von Daten in OnClose (https://www.delphipraxis.net/148642-win7-problem-mit-speichern-von-daten-onclose.html)

Helmi 5. Mär 2010 19:01


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:
{ ... }
  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;
Also beim Schliessen werden im OnClose noch Dateien (Ini-Dateien, XML-Dateien) gespeichert.
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)

jfheins 5. Mär 2010 19:12

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

Helmi 5. Mär 2010 19:17

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?

jfheins 5. Mär 2010 19:23

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 ;)

DeddyH 5. Mär 2010 19:23

Re: Win7: Problem mit Speichern von Daten in OnClose
 
Hast Du den verlinkten Artikel nicht gelesen? Kleiner Auszug:
Zitat:

Applications that must block shutdown should use the new shutdown reason API

In Windows XP, Microsoft recommended that if an application needed to block shutdown, it should display its own UI explaining why it needed to do so, so users would be less frustrated when shutdown failed. As discussed earlier, Windows Vista will reduce user frustration when shutdown fails even more, by displaying new UI that lists all the reasons applications have provided for blocking shutdown.

In Windows Vista, if your application must block shutdown, in addition to returning FALSE or not responding to WM_QUERYENDSESSION, it should leverage this new UI by using a simple API to provide Windows with a reason string explaining why it is blocking shutdown. This API is straightforward:

BOOL ShutdownBlockReasonCreate(HWND hWnd, LPCWSTR pwszReason);

BOOL ShutdownBlockReasonDestroy(HWND hWnd);

BOOL ShutdownBlockReasonQuery(HWND hWnd, LPWSTR pwszBuff, DWORD *pcchBuff);

Use of this API is detailed more fully later in this topic, as well as in the MSDN documentation for the individual ShutdownBlockReason() functions.

Again, note that this API does not replace the need to return FALSE (or delay responding) to WM_QUERYENDSESSION to block shutdown. Applications need to do this in addition to using the API. Applications that return TRUE to WM_QUERYENDSESSION will be closed at shutdown, regardless of whether they have used the API.

Also note that if your application has no visible top-level windows, it must use this API if it needs to successfully block shutdown. Such applications will automatically be terminated if they block shutdown without using the API.

Helmi 5. Mär 2010 19:31

Re: Win7: Problem mit Speichern von Daten in OnClose
 
Also wenn ich das richtig entziffere, dann muss das etwa so aussehen:

Delphi-Quellcode:
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;
Nur steh ich gerade auf dem Schlauch: Wie kann ich die Funktionen "ShutdownBlockReasonCreate" und "ShutdownBlockReasonDestroy" von Delphi aus ansteuern?

[edit]
so - nun hab ich den Aufruf hinbekommen:
Delphi-Quellcode:
function ShutdownBlockReasonCreate(HWND: hWnd; LPCWSTR: String): Boolean; stdcall;
  external user32;
function ShutdownBlockReasonDestroy(HWND: hWnd): Boolean; stdcall;
  external user32;
Aber leider funktionierts trotzdem nicht...
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

DeddyH 6. Mär 2010 08:51

Re: Win7: Problem mit Speichern von Daten in OnClose
 
Zitat:

In Windows Vista, if your application must block shutdown, in addition to returning FALSE or not responding to WM_QUERYENDSESSION, ...

Helmi 6. Mär 2010 09:36

Re: Win7: Problem mit Speichern von Daten in OnClose
 
Zitat:

Zitat von DeddyH
Zitat:

In Windows Vista, if your application must block shutdown, in addition to returning FALSE or not responding to WM_QUERYENDSESSION, ...

Es scheint mir als wärst du der Meister im zitieren!

Ich dachte es würde so funktionierten:

Delphi-Quellcode:
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;
Aber das ergibt auch nicht den gewünschten Effekt.

Hätte jemand vielleicht ein Delphi-Beispiel dafür?

DeddyH 6. Mär 2010 09:42

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.

Helmi 6. Mär 2010 09:56

Re: Win7: Problem mit Speichern von Daten in OnClose
 
Zitat:

Zitat von DeddyH
Und mir scheint, Du bist der Meister im Überlesen.

Lesen und Verstehen sind zwei paar Stiefel!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:38 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz