Tjänsttillståndsövergångar
En tjänst ansvarar för att rapportera ändringar i dess tillstånd till tjänstkontrollhanteraren (SCM). Tjänstkontrollprogram och systemet kan bara ta reda på tillståndet för en tjänst från SCM, så det är viktigt att en tjänst rapporterar dess tillstånd korrekt. En tjänst rapporterar sitt tillstånd genom att anropa funktionen SetServiceStatus med en pekare till en helt initierad SERVICE_STATUS struktur. dwCurrentState medlem i strukturen innehåller tjänsttillståndet som ska rapporteras.
Det ursprungliga tillståndet för en tjänst är SERVICE_STOPPED. När SCM startar tjänsten anger den tjänsttillståndet till SERVICE_START_PENDING och anropar tjänstens ServiceMain-funktion. Tjänsten slutför sedan initieringen med någon av de tekniker som beskrivs i Service ServiceMain Function. När tjänsten har slutfört sin initiering och är redo att börja ta emot kontrollbegäranden anropar tjänsten SetServiceStatus för att rapportera SERVICE_RUNNING och ange de kontrollbegäranden som tjänsten är beredd att acceptera. Övergången från SERVICE_START_PENDING till SERVICE_RUNNING anger för SCM- och tjänstövervakningsverktygen att tjänsten har startats. Om tjänsten rapporterar ett annat tillstånd än SERVICE_RUNNING kan SCM- eller tjänstövervakningsverktygen markera att tjänsten inte har startats.
SCM skickar endast de angivna kontrollbegäranden till tjänsten (förutom den SERVICE_CONTROL_INTERROGATE begäran, som alltid skickas). En lista över de kontrollbegäranden som en tjänst kan acceptera finns i dwControlsAccepted medlem i SERVICE_STATUS-strukturen. Information om hur du registrerar dig för att ta emot enhetshändelser finns i funktionen RegisterDeviceNotification.
Tjänsttillståndet ändras vanligtvis till följd av hanteringen av en kontrollbegäran. Kontrollbegäranden som gör att tjänsttillståndet ändras inkluderar SERVICE_CONTROL_STOP, SERVICE_CONTROL_PAUSE och SERVICE_CONTROL_CONTINUE. Om tjänsten måste utföra lång bearbetning för att hantera någon av dessa begäranden bör den skapa en sekundär tråd för att utföra den långa bearbetningen och rapportera motsvarande väntande tillstånd till SCM. (För bästa prestanda i Windows Vista och senare versioner av Windows bör tjänsten använda en arbetstråd från en trådpool för detta ändamål.) Tjänsten bör sedan rapportera den slutförda tillståndsövergången när den långa bearbetningen är klar. Mer information om hur du hanterar kontrollbegäranden finns i Service Control Handler Function.
Endast vissa tjänsttillståndsövergångar är giltiga. Följande diagram visar giltiga övergångar.
Tjänsttillståndet som rapporteras till SCM avgör hur SCM interagerar med tjänsten. Om en tjänst till exempel rapporterar SERVICE_STOP_PENDING skickar SCM inte ytterligare kontrollbegäranden till tjänsten eftersom det här tillståndet indikerar att tjänsten stängs av. Nästa tillstånd som rapporteras av tjänsten ska vara SERVICE_STOPPED eftersom det är det enda giltiga tillståndet efter SERVICE_STOP_PENDING. Men om en tjänst rapporterar en övergång som inte är giltig misslyckas inte SCM-anropet.
Följande diagram visar tjänsttillståndsövergångar i detalj, inklusive kontrollbegäranden som initierats av ett tjänstkontrollprogram (tjänstklienten) och SetServiceStatus anrop som en tjänst gör för att rapportera tillståndsändringar till SCM. Som tidigare nämnts skickar SCM endast kontrollbegäranden som tjänsten har angett att den kommer att acceptera, så en tjänst kanske inte tar emot alla begäranden som visas i diagrammet.
Relaterade ämnen