Udostępnij za pośrednictwem


Uruchamianie usługi

Aby uruchomić usługę lub usługę sterownika, program kontroli usługi używa funkcji StartService. Funkcja StartService kończy się niepowodzeniem, jeśli baza danych jest zablokowana. W takim przypadku program kontroli usługi powinien poczekać kilka sekund i ponownie wywołać StartService. Może sprawdzić bieżący stan blokady bazy danych, wywołując funkcję QueryServiceLockStatus.

Jeśli program sterowania usługą uruchamia usługę, może użyć funkcjiStartService, aby określić tablicę argumentów, które mają zostać przekazane do funkcji ServiceMain usługi. Funkcja StartService jest zwracana po utworzeniu nowego wątku w celu wykonania funkcji ServiceMain ServiceMain. Program kontroli usługi może pobrać stan nowo uruchomionej usługi w strukturze SERVICE_STATUS, wywołując funkcję QueryServiceStatus. Podczas inicjowania element członkowski dwCurrentState powinien być SERVICE_START_PENDING. Element dwWaitHint jest przedziałem czasu w milisekundach, który wskazuje, jak długo program kontroli usługi powinien czekać przed wywołaniem QueryServiceStatus ponownie. Po zakończeniu inicjowania usługa zmienia się dwCurrentState na SERVICE_RUNNING.

Menedżer kontroli usług nie obsługuje przekazywania niestandardowych zmiennych środowiskowych do usługi podczas uruchamiania. Ponadto menedżer kontroli usług nie wykrywa i nie przekazuje zmian do zmiennych środowiskowych, gdy usługa jest uruchomiona. Zamiast określać usługę zależną od zmiennej środowiskowej, użyj wartości rejestru lub ServiceMain argumentów.

Poniżej przedstawiono uproszczony przegląd tego, co się stanie po uruchomieniu typowej usługi przez menedżera kontroli usług:

  • Narzędzie SCM odczytuje ścieżkę usługi z rejestru i przygotowuje się do uruchomienia usługi. Obejmuje to uzyskanie blokady usługi. Każda próba uruchomienia innej usługi podczas blokady usługi zostanie zablokowana do momentu zwolnienia blokady usługi.
  • Narzędzie SCM uruchamia proces i czeka na zakończenie procesu podrzędnego (co wskazuje błąd) lub zgłasza stan SERVICE_RUNNING.
  • Aplikacja wykonuje bardzo proste inicjowanie i wywołuje funkcję StartServiceCtrlDispatcher.
  • StartServiceCtrlDispatcher nawiązuje połączenie z menedżerem kontroli usługi i uruchamia drugi wątek wywołujący funkcję ServiceMain dla usługi. ServiceMain powinien jak najszybciej zgłosić SERVICE_RUNNING.
  • Gdy menedżer kontroli usługi zostanie powiadomiony, że usługa jest uruchomiona, zwalnia blokadę usługi.

Jeśli usługa nie zaktualizuje swojego stanu w ciągu 80 sekund, a także ostatnia wskazówka dotycząca oczekiwania, menedżer kontroli usługi ustali, że usługa przestała odpowiadać. Menedżer kontroli usługi zarejestruje zdarzenie i zatrzyma usługę.

Jeśli program uruchamia usługę sterownika, StartService zwraca wartość po zakończeniu inicjowania sterownika urządzenia.

Aby uzyskać więcej informacji, zobacz Uruchamianie usługi.