AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Dienst, der auf das Herunterfahren eines Computers reagiert?
Thema durchsuchen
Ansicht
Themen-Optionen

Dienst, der auf das Herunterfahren eines Computers reagiert?

Ein Thema von Piro · begonnen am 31. Mär 2008 · letzter Beitrag vom 31. Mär 2008
Antwort Antwort
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

Dienst, der auf das Herunterfahren eines Computers reagiert?

  Alt 31. Mär 2008, 16:20
Hallo,

ist es möglich einen Dienst zu programmieren, der auf das Herunterfahren oder Ausloggen des Benutzer reagiert?

Ich habe es mal mit der unten aufgeführten Funktion in einem Dienst probiert aber ohne Erfolg.
Delphi-Quellcode:
...
type
  TMyUpTimeService = class(TService)
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceBeforeUninstall(Sender: TService);
    procedure ServiceExecute(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServiceCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    function GetServiceController: TServiceController; override;
    procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
  end;
...
procedure TMyUpTimeService..WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
 // Auf Windows Ereignis reagieren
 case Msg.Unused of
   Integer(ENDSESSION_LOGOFF) :
     begin
       // Code beim Logoff Ereignis
     end;
 else
   begin
       // Code beim Restart / Herunterfahren Ereignis
   end;
 end;

 // Windows kann herunter, neugestartet werden oder Benutzer kann sich ausloggen
 Msg.Result := 1;
end;
...
In meiner laufenden Anwendung funktioniert es wunderbar aber nicht wenn ich das in einen Dienst einbaue.

Wie müßte ich es umsetzen oder welche Technik müßte ich verwenden?

Vielen Dank. Sven
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Dienst, der auf das Herunterfahren eines Computers reagi

  Alt 31. Mär 2008, 21:14
Hallo Sven,

Hier mal zwei Stichwörter, welche bei der Lösung weiterhelfen sollten:

Bei Google suchenSERVICE_CONTROL_SHUTDOWN Bei Google suchenCTRL_LOGOFF_EVENT
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Dienst, der auf das Herunterfahren eines Computers reagi

  Alt 31. Mär 2008, 21:20
Dein Service ist kein Fenster und kann dementsprechend keine Nachrichten empfangen. Wenn dann musst du innerhalb deines Service ein Fenster erstellen und dieser kann dann die Nachricht verarbeiten wenn du mit Messages arbeiten willst.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#4

Re: Dienst, der auf das Herunterfahren eines Computers reagi

  Alt 31. Mär 2008, 21:50
1. Fenster zu erzeugen als Dienst ist ein absolutes NO GO. Man nutze diesbezüglich Google: Bei Google suchenShatter Attacks.
2. Selbst wenn er ein Fenster erstellen würde, würde er keine Nachricht bekommen.

Wie toms bereits erwähnt hat, ist die Verwendung des SERVICE_CONTROL_SHUTDOWN Events der richtige Weg. Wenn Du Deinen Service mit Hilfe des Service Projekts in Delphi entwickelt hast, kannst Du auf das Event einfach reagieren indem Du den OnShutdown Event Handler des TService Objekts benutzt. Du solltest übrigens nichts allzu komplexes im Shutdown Handler machen. Du hast 20 Sekunden Zeit, ansonsten dreht Dir der SCM einfach den Saft ab und schießt deinen Prozess ab.
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Dienst, der auf das Herunterfahren eines Computers reagi

  Alt 31. Mär 2008, 22:05
Wenn ich das OnShutdown Event benutze, wie kann ich dann zwischen Herunterfahren / Neustarten und Logoff unterscheiden?

Vielen Dank schon mal für die zahlreichen Informationen.

Schönen Abend noch.
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Dienst, der auf das Herunterfahren eines Computers reagi

  Alt 31. Mär 2008, 22:08
Guten Abend,

vielleicht hilft Dir dieser Eintrag aus dem msdn2 weiter.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#7

Re: Dienst, der auf das Herunterfahren eines Computers reagi

  Alt 31. Mär 2008, 22:10
OnShutdown wird ausschließlich beim Herunterfahren bzw. Neustarten ausgelöst. Für den User Logoff wirst Du SetConsoleCtrlHandler benutzen müssen um auf das CTRL_LOGOFF_EVENT Event reagieren zu können.

Ich war mal so frei und habs implementiert:

Delphi-Quellcode:
function CtrlHandlerFunction(dwCtrlType : DWORD) : BOOL; stdcall;
begin
  // Generell geben wir FALSE zurück, da wir nicht alle Events bearbeiten. Sollten
  // wir aber auf ein Event reagieren, so müssen wir TRUE zurück geben.
  result := false;
  case dwCtrlType of
    CTRL_LOGOFF_EVENT :
      begin
        // Mach was immer Du machen möchtest sobald der User ausloggt :)
        result := true;
      end;
    CTRL_SHUTDOWN_EVENT :
      begin
        // Wenn Du OnShutdown nutzt, ist das nicht notwendig, prinzipiell ließe
        // sich im Event Handler aber auch auf ein Herunterfahren reagieren.
        result := true;
      end;
  end;
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
  SetConsoleCtrlHandler(@CtrlHandlerFunction, true);
end;
Wenn Du statt des Console Control Handlers lieber das OnShutdown Event verwenden möchtest von TService, lösch den Part hier einfach:

Delphi-Quellcode:
    CTRL_SHUTDOWN_EVENT :
      begin
        // Wenn Du OnShutdown nutzt, ist das nicht notwendig, prinzipiell ließe
        // sich im Event Handler aber auch auf ein Herunterfahren reagieren.
        result := true;
      end;
Der Code ist untested, weil ich derzeit nicht reloggen kann. Allerdings denke ich nicht, daß ich nen Fehler drin hab. Garantieren tu ich allerdings wie immer für nichts. Wer sich an meinem Coding Stil stört hat - ebenfalls wie immer - selbst schuld .
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:12 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