Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Fehlermeldung beim Runterfahren mit Systemdienst (https://www.delphipraxis.net/144578-fehlermeldung-beim-runterfahren-mit-systemdienst.html)

Mavarik 11. Dez 2009 07:37


Fehlermeldung beim Runterfahren mit Systemdienst
 
Hallo Zusammen...

Die Problemer werden weniger aber es gibt immer noch welche... :stupid:

"DLL-Initialisierung fehlgeschlagen..."
"Die Anwendung konnte nicht initialisiert werden, da die Arbeitsstation gerade heruntergefahren wird."

Diese Meldung erhalte ich beim runterfahren von W2k & XP - Vista bleibt ohne Meldung.

Ich gehe davon aus, das mein Systemdienst nicht "richtig" auf das herunterfahren reagiert.

Hat jemand ne Idee?

Grüsse Mavarik :coder:

nahpets 11. Dez 2009 07:53

Re: Fehlermeldung beim Runterfahren mit Systemdienst
 
Hallo,

das klingt so, als wolle da ein Porgramm, Dienst.. starten, während das System heruntergefahren wird.
Bei Diensten fällt mir als Ursache da momentan nur folgendes ein:

Der Dienst ist so konfiguriert, das er, sofern er (unbeabsichtigt?) beendet wird, automatisch neu gestartet wird.
Ist in der Dienstekonfiguration auf dem Reiter "Wiederherstellen" eventuell irgendwas konfiguriert, was beim Dienstausfall zu geschehen hat?

Oder ist der Dienst so geschrieben, dass er sich im Fehlerfalle eventuell neu startet?

Gibt es eine Diensteüberwachung, die ausgefallenen Dienste neu startet und (dummerweise) auch beim Herunterfahren noch den Neustart bereits beendeter Dienste "anregt"?

Mavarik 11. Dez 2009 08:15

Re: Fehlermeldung beim Runterfahren mit Systemdienst
 
Zitat:

Zitat von nahpets
das klingt so, als wolle da ein Porgramm, Dienst.. starten, während das System heruntergefahren wird.

Nein eigentlich macht der Dienst gerade nix, bzw. wartet auf eine SetEvent

Zitat:

Zitat von nahpets
Der Dienst ist so konfiguriert, das er, sofern er (unbeabsichtigt?) beendet wird, automatisch neu gestartet wird.Ist in der Dienstekonfiguration auf dem Reiter "Wiederherstellen" eventuell irgendwas konfiguriert, was beim Dienstausfall zu geschehen hat?

Eigentlich auch nicht der dienst wird erzeugt mit:

Delphi-Quellcode:
Service := CreateService(SCManager, ServiceName, DisplayName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, pchar(FileName), nil, nil, nil, nil, nil);
Zitat:

Zitat von nahpets
Oder ist der Dienst so geschrieben, dass er sich im Fehlerfalle eventuell neu startet?

Nicht das ich wüsste...

Gibt es nicht auch sowas für dies für Dienste?

Delphi-Quellcode:
procedure WMQUERYENDSESSION(var msg: TMessage); message WM_QUERYENDSESSION;
oder erhalten die "nur" einen Stopevent...

Kann es sein, dass ich einfach nicht schnell genug alle erzeugten Threads beende?

Mavarik :coder:

nahpets 11. Dez 2009 08:30

Re: Fehlermeldung beim Runterfahren mit Systemdienst
 
Zitat:

Zitat von Mavarik
Zitat:

Zitat von nahpets
das klingt so, als wolle da ein Porgramm, Dienst.. starten, während das System heruntergefahren wird.

Nein eigentlich macht der Dienst gerade nix, bzw. wartet auf eine SetEvent

Die mag durchaus richtig sein, aber: Wenn der Dienst bereist auf da Beendensignal reagiert hat und beendet wurde und nun (warum auch immer) beim Herunterfahren neu startet, kann das von Dir beschriebene Problem auftreten. Das heißt: Fehlerursache muss nicht in Deinem Dienst liegen.

Zitat:

Zitat von Mavarik
Zitat:

Zitat von nahpets
Der Dienst ist so konfiguriert, das er, sofern er (unbeabsichtigt?) beendet wird, automatisch neu gestartet wird.Ist in der Dienstekonfiguration auf dem Reiter "Wiederherstellen" eventuell irgendwas konfiguriert, was beim Dienstausfall zu geschehen hat?

Eigentlich auch nicht der dienst wird erzeugt mit:

Delphi-Quellcode:
Service := CreateService(SCManager, ServiceName, DisplayName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, pchar(FileName), nil, nil, nil, nil, nil);

Siehe oben: Wenn das beim Herunterfahren aufgerufen wird, kann der beschriebene Fehler auftreten. Das Betriebssystem ist also quasi schon halb weg, aber der Dienst wurde veranlasst, zu starten.

Zitat:

Zitat von Mavarik
Zitat:

Zitat von nahpets
Oder ist der Dienst so geschrieben, dass er sich im Fehlerfalle eventuell neu startet?

Nicht das ich wüsste...

Gibt es nicht auch sowas für dies für Dienste?

Delphi-Quellcode:
procedure WMQUERYENDSESSION(var msg: TMessage); message WM_QUERYENDSESSION;

Weiß ich nicht.

Zitat:

Zitat von Mavarik
oder erhalten die "nur" einen Stopevent...

Kann es sein, dass ich einfach nicht schnell genug alle erzeugten Threads beende?

Mavarik :coder:

Ja, oder eventuell sogar noch neue erzeugt werden. Ich weiß leider nicht, ob man die Wartezeit des Betriebssystems bis zum Beenden von Diensten irgendwie konfigurieren kann. Dies könnte zumindest bei der Fehlersuche hilfreich sein, frei nach dem Motto: Wartezeit ist länger, Problem ist weg. Dann: Der Dienst beendet sich nicht schnell genug. Damit hast Du dann einen Ansatzpunkt für die Fehlersuche /-behebung.

Astat 11. Dez 2009 21:42

Re: Fehlermeldung beim Runterfahren mit Systemdienst
 
Hallo Mavarik.
  • Mavarik hat geschrieben:
Zitat:

oder erhalten die "nur" einen Stopevent...
Ja die Dienste erhalten über den ServiceHandler ein SERVICE_CONTROL_SHUTDOWN.
  • Mavarik hat geschrieben:
Zitat:

Kann es sein, dass ich einfach nicht schnell genug alle erzeugten Threads beende?
Ja, wenn PServiceStatus^.dwWaitHint kleiner als die Zeit, die für das Beenden aller Threadss benötigt wird, ist.

Also wie ich das verstanden habe ist dein Dienst wie folgt aufgebaut:

DispatchTable initialisieren -> @serviceproc -> ServiceName
StartServiceCtrlDispatcher -> @serviceproc
RegisterServiceCtrlhandler -> SetServiceStatus
ServiceMain -> WorkerCode + WorkerThreads -> WairFor -> Event -> ServiceHandler

Nach Signalling des Synchronisationsobjects(Event) wird in der ServiceMain aufgeräumt,
danach die Prozedure verlassen und somit sollte der Service beendet sein, und das System kann
herunterfahren.

Delphi-Quellcode:
procedure ServiceHandler(fdwcontrol: integer); stdcall;
begin
  case fdwcontrol of
    SERVICE_CONTROL_STOP:
    SERVICE_CONTROL_PAUSE:
    SERVICE_CONTROL_CONTINUE:
    SERVICE_CONTROL_INTERROGATE:
    SERVICE_CONTROL_SHUTDOWN:
      begin
        if hStoppedEvent > 0 then SetEvent(hStoppedEvent);
      end;
  end;
end;

Versuch mal folgendes, um herauszufinden wo es genau hakt.

1. Testweise, ohne SERVICE_INTERACTIVE_PROCESS -> Reboot
2. Ohne das Aufräumen der Threads, bzw. gleich ohne diese überhaupt zu starten. -> Reboot


lg. Astat

Delphi-Laie 12. Dez 2009 09:31

Re: Fehlermeldung beim Runterfahren mit Systemdienst
 
Zitat:

Zitat von Mavarik
Systemdienst

Was ist ein Systemdienst?

Mithrandir 12. Dez 2009 09:43

Re: Fehlermeldung beim Runterfahren mit Systemdienst
 
Die lange Schreibweise für "Dienst". ;)

Mavarik 14. Dez 2009 10:11

Re: Fehlermeldung beim Runterfahren mit Systemdienst
 
Zitat:

Zitat von Astat
Ja die Dienste erhalten über den ServiceHandler ein SERVICE_CONTROL_SHUTDOWN.

Interessanter weise sendet XP "nur" ein SERVICE_CONTROL_STOP

Mavarik

Astat 14. Dez 2009 21:45

Re: Fehlermeldung beim Runterfahren mit Systemdienst
 
Hallo Mavarik.

Nö, wenn Service Control Handler Function korrekt implemenetiert, wird ein Shutdown ausgeführt.

Siehe: http://msdn.microsoft.com/en-us/library/ms685149(VS.85).aspx

lg. Astat

Mavarik 15. Dez 2009 20:06

Re: Fehlermeldung beim Runterfahren mit Systemdienst
 
Zitat:

Zitat von Astat
Nö, wenn Service Control Handler Function korrekt implemenetiert, wird ein Shutdown ausgeführt.

Wenn mein Dienst korrekt implementiert wäre, würde ich nicht hier Schreiben und eine Fehlermeldung erhalten...

Aber ich bin ja schon weiter...

Also...

Status.dwControlsAccepted := SERVICE_ACCEPT_STOP or SERVICE_ACCEPT_PAUSE_CONTINUE or SERVICE_ACCEPT_SHUTDOWN;

das fehlte schon mal...

Und obwohl ich
Delphi-Quellcode:
    SERVICE_CONTROL_SHUTDOWN:
       begin
         Stopped := True;
         StopEvent.SetEvent;
         Status.dwCurrentState := SERVICE_STOP_PENDING;
         Status.dwWaitHint := 3000;
         Status.dwWin32ExitCode := NO_ERROR;
         SetServiceStatus(StatusHandle, Status);
       end
setze und (mein Dienst sich innerhalb von 430ms inkl. Logdateischreiben, sich beendet)

erhalte ich trotzdem die "Fehlermeldung" noch jemand ne Idee?

Grüsse Mavarik
:gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr.
Seite 1 von 2  1 2      

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