AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dienst "wird beendet"

Ein Thema von FriFra · begonnen am 29. Jul 2009 · letzter Beitrag vom 4. Mai 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#1

Dienst "wird beendet"

  Alt 29. Jul 2009, 02:07
Ich habe einen eigentlich recht simplen Dienst, welcher beim start über shellexecute ein anderes Programm aufruft. Wenn dieses andere Programm beendet wird, piped dieses eine Message zum Service, welcher sich daraufhin beenden soll. dazu verwende ich einen Timer, welcher eine Variable überwacht, die duch die Message verändert wird:
Delphi-Quellcode:
procedure TEasyServer.Timer1Timer(Sender: TObject);
begin
  if uPipesService.bShutDown then
  begin
    Timer1.Enabled := False;
    FServer.ShutDownServer; //TPipeServer
    FServer.Free;
    EasyServer.DoStop;

  end;
end;
Die Message kommt offensichtlich an, denn der Status des Service wechselt zu "wird beendet"... aber er beendet sich nicht. Es gibt nirgends irgendwelche Schleifen oder ähnliches... ich hab keine Erklärung, warum der Prozess weiter läuft.
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Dienst "wird beendet"

  Alt 29. Jul 2009, 16:53
Behandelst du das Ereignis OnStop?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Dienst "wird beendet"

  Alt 29. Jul 2009, 21:42
Ja, da pipe ich noch eine message zu einem anderen Programm (das sich übrigens daraufhin korrekt beendet) und dann sollte eigentlich schluß sein... ist es aber nicht
Delphi-Quellcode:
procedure TEasyServer.ServiceStop(Sender: TService; var Stopped: Boolean);
var
  PipeClient: TPipeClient;
begin
  PipeClient := TPipeClient.Create('', 'easyServerPipe');
  PipeClient.SendString('quit');
  PipeClient.Free;
  Stopped := True;
end;
Wenn ich den dienst über den Dienste-Manager beende piped er die genannten Messages auch an die anderen Programme, aber da wird er dann auch beendet. ich habe langsam den Verdacht das DoStop nicht die richtige Methode ist... Ich würde den dienst auch knallhart abschießen, wenn es denn eine Terminate methode gäbe...
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Dienst "wird beendet"

  Alt 30. Jul 2009, 22:55
hat keiner eine Idee?
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Dienst "wird beendet"

  Alt 31. Jul 2009, 00:42
Es gab doch noch OnShutdown welches beim Beenden aufgerufen wurde. Habe länger nichts mehr mit Services zu tun gehabt und könnte mich dann auch erinnern. Aber ich habe damals an zwei Stellen meine Funktion zum beenden aller Threads (war ein Multithread-Service) aufgerufen.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Dienst "wird beendet"

  Alt 31. Jul 2009, 10:38
Wenn sich der Service selbst beenden soll, wird bei mir OnShutdown NICHT aufgerufen... ich hab das gerad mal mit Messageboxen geprüft... wenn ich den Dienst über den Dienste-Manager beende, durchläuft der OnStop und Onshutdown und wird sauber beendet.

Es gibt definitiv keine nicht geschlossenen Objekte mehr, die das verursachen können... Ich steh auf dem Schlauch

P.S.: Ich habe auch keine echten Threads, sondern nur eigenständige Anwendungen, welche über Pipes mit dem Server (Consolen-Anwendung) reden, der wiederrum dem Dienst (dient nur als Starter) über Pipes mitteilt, wenn er beendet wird.
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Dienst "wird beendet"

  Alt 31. Jul 2009, 22:35
Ich habs jetzt aufgegeben den Dienst dazu bewegen zu wollen, sich selber zu beenden... Jetzt sennde ich eben keine Message mehr, die den Dienst dazu bringt sich zu beenden, sondern rufe einfach folgenden Code auf:            ShellExecute(0, 'open', 'net', 'stop EasyServer', '', 0); Damit ist das Problem gelöst.
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
skateracer

Registriert seit: 13. Jan 2010
1 Beiträge
 
#8

Re: Dienst "wird beendet"

  Alt 12. Mär 2010, 12:43
Bei mir funktioniert nur diese Schreibweise:

ShellExecute(0, 'open', 'cmd', PCHAR('/k' + 'net stop "David Grabbing Server"'), '', 0);
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Dienst "wird beendet"

  Alt 12. Mär 2010, 12:48
Das setzt aber voraus, dass das vom Service gestartete Programm als Administrator läuft.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#10

Re: Dienst "wird beendet"

  Alt 12. Mär 2010, 13:33
Es gibt einige Probleme mit den Shellfunktionen, wenn man sie aus einem Dienst startet.

Man kann einen Dienst ganz einfach beenden, indem man die Executemethode verlässt.
In den JWSCL Beispielen gibt es einige Dienste, die Pipes verwenden (ja sogar mehrere) und auf deren Ende warten und trotzdem die Dienstmanagernachrichten beantworten. (z.B. unvollendete Projekt: XPElevation -> MainUnit.pas)

Delphi-Quellcode:
   try //except
      try
        fThreadsStoppedEvent := CreateEvent(nil, true, false, nil);
        fServiceStopEvent := CreateEvent(nil, true, false, nil);
        Sleep(1000);


        ZeroMemory(@OvLapped, sizeof(OvLapped));
        OvLapped.hEvent := CreateEvent(nil, false, false, nil);
...

          try
            Pipe := CreateServicePipe(Log);
            repeat
              ConnectNamedPipe(Pipe, @OvLapped);

              repeat
                if Assigned(ServiceThread) then
                  ServiceThread.ProcessRequests(False);


                if (TJwWindowsVersion.IsWindowsXP(true) or
                    TJwWindowsVersion.IsWindows2003(true)) and
                      (GetSystemMetrics(SM_SHUTTINGDOWN) <> 0) then
                    Stopped := true;

                SetLastError(0);
                WaitResult := JwMsgWaitForMultipleObjects([fServiceStopEvent, OvLapped.hEvent], false, INFINITE, QS_ALLINPUT);

                case WaitResult of
                  WAIT_OBJECT_0 + 1 : ResetEvent(OvLapped.hEvent);
                  WAIT_OBJECT_0 + 2 : PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE); //tag message as read
                else
                  OutputDebugString(PChar(IntToStr(GetLastError)));
                end;

              until WaitResult <> WAIT_OBJECT_0 + 2; //
              
              if WaitResult = WAIT_OBJECT_0 +1 then //OvLapped.hEvent
              begin
                ...
                {We use this pipe only a very short time so it is very unlikely
                that several clients are going to connect at the same time.
                }

                PipeName := THandleRequestThread.CreatePipeName(UniquePipeID);
                
                ReadFile(Pipe, @ProtocolVersion, sizeof(ProtocolVersion) ,nil, @OvLapped2);

                if JwWaitForMultipleObjects([fServiceStopEvent, OvLapped2.hEvent], false,
                      {$IFNDEF DEBUG}1000{$ELSE}INFINITE{$ENDIF}) = WAIT_OBJECT_0 +1 then
                begin
... //Pipeclient und extra Thread übergeben.
                end;
...
...
              Sleep(5000);
              DisconnectNamedPipe(Pipe);

            until Stopped;

          finally
//signal server shutdown
            Stopped := true;

            {Wait for all threads to be stopped or timeout
            Set by a method that is called by threads which are finished.
            It decreases a value down to 0 and then fires the event.
            }

            WaitForSingleObject(ThreadsStopEvent, 30 * 1000);
          
            fPasswords.Free;
          end;
Und manuelles Stopereignis:
Delphi-Quellcode:
procedure TXPService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  SetEvent(fServiceStopEvent);
end;
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  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 21:33 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