Tjänststart
För att starta en tjänst eller drivrutinstjänst använder tjänstkontrollprogrammet funktionen StartService. Funktionen StartService misslyckas om databasen är låst. Om detta inträffar bör tjänstkontrollprogrammet vänta några sekunder och anropa StartService igen. Den kan kontrollera databasens aktuella låsstatus genom att anropa funktionen QueryServiceLockStatus.
Om tjänstkontrollprogrammet startar en tjänst kan den använda funktionen StartService för att ange en matris med argument som ska skickas till tjänstens ServiceMain-funktion. Funktionen StartService returneras när en ny tråd har skapats för att köra funktionen ServiceMain. Tjänstkontrollprogrammet kan hämta status för den nyligen startade tjänsten i en SERVICE_STATUS struktur genom att anropa funktionen QueryServiceStatus. Under initieringen bör dwCurrentState medlem vara SERVICE_START_PENDING. dwWaitHint medlem är ett tidsintervall, i millisekunder, som anger hur länge tjänstkontrollprogrammet ska vänta innan QueryServiceStatus igen. När initieringen är klar ändras tjänsten dwCurrentState till SERVICE_RUNNING.
Tjänstkontrollhanteraren stöder inte överföring av anpassade miljövariabler till en tjänst vid start. Dessutom identifierar och vidarebefordrar inte tjänstkontrollhanteraren ändringar i miljövariabler när tjänsten körs. I stället för att göra en tjänst beroende av en miljövariabel använder du registervärden eller ServiceMain argument.
Följande är en förenklad översikt över vad som händer när en typisk tjänst startas av tjänstkontrollhanteraren:
- SCM läser tjänstsökvägen från registret och förbereder för att starta tjänsten. Detta inkluderar att hämta tjänstlåset. Alla försök att starta en annan tjänst medan tjänstlåset hålls blockeras tills tjänstlåset släpps.
- SCM startar processen och väntar tills antingen den underordnade processen avslutas (vilket indikerar ett fel) eller rapporterar SERVICE_RUNNING status.
- Programmet utför sin mycket enkla initiering och anropar funktionen StartServiceCtrlDispatcher.
- StartServiceCtrlDispatcher ansluter till tjänstkontrollhanteraren och startar en andra tråd som anropar funktionen ServiceMain för tjänsten. ServiceMain bör rapportera SERVICE_RUNNING så snart som möjligt.
- När tjänstkontrollhanteraren meddelas att tjänsten körs frigörs tjänstlåset.
Om tjänsten inte uppdaterar sin status inom 80 sekunder, plus det sista väntetipset, fastställer tjänstkontrollhanteraren att tjänsten har slutat svara. Tjänstkontrollhanteraren loggar en händelse och stoppar tjänsten.
Om programmet startar en drivrutinstjänst returnerar StartService när enhetsdrivrutinen har slutfört initieringen.
Mer information finns i Starta en tjänst.