AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Wie am Besten Shutdowns protokollieren?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie am Besten Shutdowns protokollieren?

Ein Thema von TStringlist · begonnen am 18. Jun 2005 · letzter Beitrag vom 19. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#1

Wie am Besten Shutdowns protokollieren?

  Alt 18. Jun 2005, 15:07
Hallo,

bezgl. des oben erwähnten Themas gibt es ja seit W2k folgenden Ablauf bzw. damit verbundenes Problem:

Bei einem ausgelösten Shutdown wird jedes zu dieser Zeit noch laufende Programm jeweils zuerst mit der WM_QueryEndSession-Message beschickt. Als nächstes, sofern der Shutdown davor durch die Query nicht abgelehnt wurde, bekommt es dann schon die WM_EndSession-Message, woraufhin das Prog beendet wird. DANACH ERST wird das nächste noch laufende Programm auf die gleiche Weise behandelt. Da man so ein Shutdown-Protokoll-Programm normalerweise aber über den Run-Schlüssel der Registry startet und die Programme beim Shutdown dann in der gleichen Reihenfolge aufgerufen werden, in der sie auch gestartet wurden, kann also leicht folgende Situation entstehen: Dieses besagte Protokoll-Programm wird als erstes aufgerufen, protokolliert den Zeitpunkt des Shutdowns und wird dann beendet. Danach kommt das nächste noch laufende Programm dran, kriegt die WM_QueryEndSession-Message und lehnt den Shutdown aber ab. Folge: Der Shutdown wurde protokolliert, das dafür zuständige Programm beendet und danach wurde der Shutdown-Vorgang aber selbst abgebrochen!!!


Als Lösung habe ich mir dabei schon überlegt:

1.) ...dass sich das Protokollprogramm in dieser Situation einfach selbst nochmal aufruft, um so ans "Ende" aller momentan noch laufenden Programme zu gelangen ...und damit Shutdown-mäßig auch erst dann angesprochen zu werden, wenn es nach ihm auch wirklich zum Shutdown kommt.

2.) ...man müsste diesem Protokollprogramm so einen Status verpassen können, wie Systemprogrammen ala, svchost.exe,WinMgmt.exe o. spoolsv.exe. ...die ja auch irgendwie nicht abgefragt werden und Shutdown-mäßig auch erst irgendwie "später" dran sind. Nur wie das am Besten bewerkstelligen???

...oder gibt's da event. noch andere/bessere Möglichkeiten?


Thx.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#2

Re: Wie am Besten Shutdowns protokollieren?

  Alt 18. Jun 2005, 15:36
Nach WM_QueryEndSession wird doch noch ein WM_ENDSESSION gesendet, dessen wparam true ist, wenn Windows tatsächlich heruntergefahren wird.

EDIT: Zu 2): Diese Programme sind allesamt Dienste, sprich du müsstest einen solchen schreiben, um selbigen Status zu bekommen.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Wie am Besten Shutdowns protokollieren?

  Alt 18. Jun 2005, 16:09
Moin TStringList,

ich weiss zwar nicht, ob das für Deinen Zweck brauchbar ist aber, das System protokolliert einen Shutdown im Eventlog.
Es handelt sich hier um das Systemlog, EventID 6006 "Der Ereignisprotokolldienst wurde beendet.". Das müsste, IMHO, die letzte Aktion sein.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Wie am Besten Shutdowns protokollieren?

  Alt 18. Jun 2005, 17:05
hallo & thx (@both)

Zitat:
Nach WM_QueryEndSession wird doch noch ein WM_ENDSESSION gesendet, dessen wparam true ist, wenn Windows tatsächlich heruntergefahren wird.
mit "If the session is being ended,..." meinte die PSDK wahrscheinlich nur die jeweilig angesprochende Programm-Session. Bestimmt hatte ich mich im obigen Post auch nicht richtig deutlich ausgedrückt. Aber ein zu diesem Zeitpunkt noch laufendes Programm wird zuerst komplett mit beiden Messages (WM_QueryEndSession & WM_EndSession) abgehandelt, bevor das jeweils nächste noch laufende dann überhaupt erst mit der WM_QueryendSession-message angesprochen wird. (Das ist ja gerade das irgendwie unglaubliche *g*.) ...Und weswegen Windows über die eigentliche Session des Systems dann ja auch noch gar keine Aussage machen kann.

Zitat:
EDIT: Zu 2): Diese Programme sind allesamt Dienste, sprich du müsstest einen solchen schreiben, um selbigen Status zu bekommen.
Hört sich vielversprechend an! Kann man so einen Dienst auch mit einem D7PE schreiben? D7PE hat nämlich in Datei>Neu>Weitere>Objektgalerie keinen Eintrag >Service-Anwendung. (Zur Not hätte ich auch noch D2005PE, nur noch nicht ausgepackt - wenn es denn damit geht).

Zitat:
ich weiss zwar nicht, ob das für Deinen Zweck brauchbar ist aber, das System protokolliert einen Shutdown im Eventlog.
..brauchbar wär's nur wenn so ein Eintrag dann programmtechnisch auch irgendwie auslesbar wäre. Wo kann man sich diese Einträge denn eigentlich anzeigen lassen. Unter >Computerverwaltung>System>Ergebnisanzeige>Syste m sehen ich zwar manchmal "eventlog" eingetragen, aber ansonsten tappe ich da im Moment irgendwie im Dunkeln.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#5

Re: Wie am Besten Shutdowns protokollieren?

  Alt 18. Jun 2005, 22:59
Bei mir (WinXP SP2) wird WM_ENDSESSION nur bei einem tatsächlichen herunterfahren/abmelde etc. mit Message.result = 0 ausgelöst, bei Abbruch oder normalem beenden des Programms nicht. WM_ENDSESSION ist auch in der PSDK eindeutig mit WM_QueryEndSession verknüpft.

Zitat:
The WM_QUERYENDSESSION message is sent when the user chooses to end the session or when an application calls the ExitWindows function. If any application returns zero, the session is not ended. The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

After processing this message, the system sends the WM_ENDSESSION message with the wParam parameter set to the results of the WM_QUERYENDSESSION message.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Wie am Besten Shutdowns protokollieren?

  Alt 19. Jun 2005, 10:57
Zitat:
Bei mir (WinXP SP2) wird WM_ENDSESSION nur bei einem tatsächlichen herunterfahren/abmelde etc. mit Message.result = 0 ausgelöst, bei Abbruch oder normalem beenden des Programms nicht.
Beim Abbruch/Beenden eines Programms im Rahmen bzw. verursacht durch einen ausgelösten Shutdown-Vorgang auch nicht? Und bloß um Abläufe in diesem Rahmen geht es ja hier auch nur.

Zitat:
WM_ENDSESSION ist auch in der PSDK eindeutig mit WM_QueryEndSession verknüpft.
Logo, ich behauptete ja auch nie irgend etwas anderes.


Schreib doch mal bitte folgendes kleine Programm:
Delphi-Quellcode:
    ...
  private
    { Private-Deklarationen }
    procedure QueryEndSessionHandler(var Msg : TMessage); message WM_QueryEndSession;
    procedure EndSessionHandler(var Msg : TMessage); message WM_EndSession;
  public
    ...

procedure TForm1.QueryEndSessionHandler(var Msg : TMessage);
begin
  if MessageDlg('Prog: '+Application.Title+#13#13'WM_QueryEndSession is arrived! Agree?',
                  mtWarning,mbYesNoCancel,0) <> mrYes
  then Msg.Result := integer(False)
  else Msg.Result := integer(True);
end;

procedure TForm1.EndSessionHandler(var Msg : TMessage);
begin
  if Msg.WParam = integer(true) then windows.beep(2000,1000);
  if Msg.WParam = integer(false) then windows.beep(500,1000);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Caption := TimeToStr(Now);
  Application.Title := TimeToStr(Now);
end;
...und starte es danach 3 mal im Abstand von mindestens 1 Sekunde, so dass alle 3 Progs dann gleichzeitig auf dem Screen zu sehen sind. Danach führe einen Shutdown aus. Ergebnis (jedenfalls bei mir): Solange ich einen MessageDlg mit "Yes" beantworte, bekomme ich auch immer schon unmittelbar danach einen hohen Ton zurück; dieses jeweilige Programm verschwindet dann und danach erst erscheint der MessageDlg des jeweils eins o. zwei Sekunden später gestarteten Programms! Den MessageDlg des dritten Progs kann ich dann schließlich mit "No" beantworten und der Shutdown-Vorgang wird dadurch insgesamt abgebrochen! ...Was doch also heißen muss, dass WM_EndSession-Messages davor keine gültige Information über den wirklichen Ausgang des Shutdown-Vorgangs haben können (sondern höchsten über eine diesbezügliche Absicht des Systems).

So das Ganze jedenfalls bei Windows 2000 Pro. Ich kann mir aber irgendwie nur schlecht vorstellen, dass bei WinXP das anders läuft. Bei Windows Me/98/95 jedoch scheint es noch anders gewesen zu sein, aber aus irgendwelchen unerfindlichen Gründen haben sie das dann wohl geändert. WM_QueryEndSession -> PSDK:

Zitat:
Remarks
...

When an application returns TRUE for this message, it receives the WM_ENDSESSION message and it is terminated, regardless of how the other applications respond to the WM_QUERYENDSESSION message.


Windows Me/98/95: After all applications return TRUE for this message, they receive the WM_ENDSESSION and they are terminated.
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#7

Re: Wie am Besten Shutdowns protokollieren?

  Alt 19. Jun 2005, 14:24
Jetzt ist klar, was du meinst (denke ich): Programme, die sich nicht mit einer Antwort auf WM_QueryEndSession "wehren", werden teilweise beendet, bevor ein anderes Programm den Shutdown ablehnt.
Ich konnte dies zwar mit dem Test-Protokollprogramm, das kein WM_QueryEndSession sondern nur WM_EndSession behandelt, nicht reproduzieren, aber eventuell ist ein Dienst tatsächlich sicherer, bzw. die Auswertung des Eventlog.
  Mit Zitat antworten Zitat
TStringlist

Registriert seit: 1. Dez 2003
360 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Wie am Besten Shutdowns protokollieren?

  Alt 19. Jun 2005, 15:58
Sofern du dieses Test-Protokollprogramm früher gestartet hast als dasjenige, welches dann den Shutdown ablehnt, sollte dieses Test-Prog einfach schon aus der Taskbar (oder auch dem Taskmanager) verschwunden sein. Müsste also eher leicht feststellbar sein. (Wenn die WM_QueryEndSession nicht extra behandelt wird, schickt nämlich die DefWindowProc damit ein True zurück).

Zum Dienst: Sowas können wir ja leider mit einer D7PE nicht erzeugen , oder? Dazu fehlt uns neben den Menue-Einträgen in der Objektgalerie nämlich auch noch das TService-Objekt bzw. die SvcMgr-Unit. Trifft das eigentlich auch noch auf D2005PE zu? Gemäß 'Klatsch & Tratsch' hast du doch beide Versionen und bestimmt auch eine davon installiert . Wäre jedenfalls cool wenn die das vielleicht irgendwann mal zufälligerweise geändert hätten...
MfG (& Thx ggf.)
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#9

Re: Wie am Besten Shutdowns protokollieren?

  Alt 19. Jun 2005, 16:07
Sieh Dir mal MSDN-Library durchsuchenSetProcessShutdownParameters (WinNT) an.
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#10

Re: Wie am Besten Shutdowns protokollieren?

  Alt 19. Jun 2005, 16:14
Das geht, genaueres findest du in der DP, Stichwort Hier im Forum suchenSvcMgr oder Hier im Forum suchenTService, was du auf jedenfall dazu brauchst, ist eine "nachgebaute" Version der SvcMgr.pas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:38 Uhr.
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