ServiceMain – funkce
Když program řízení služeb požádá o spuštění nové služby, spustí správce řízení služeb (SCM) službu a odešle žádost o spuštění dispečeru řízení. Dispečer ovládacího prvku vytvoří nové vlákno pro spuštění funkce ServiceMain pro službu. Příklad najdete v tématu Zápis funkce ServiceMain.
Funkce ServiceMain by měla provádět následující úlohy:
Inicializace všech globálních proměnných
Volání RegisterServiceCtrlHandler funkce okamžitě zaregistrovat obslužnou rutinu pro zpracování žádostí o řízení pro službu. Návratová hodnota RegisterServiceCtrlHandler je popisovač stavu služby, který se použije při voláních k oznámení SCM o stavu služby.
Proveďte inicializaci. Pokud se očekává, že doba provádění inicializačního kódu bude velmi krátká (menší než jedna sekunda), lze inicializaci provést přímo v ServiceMain.
Pokud se očekává, že doba inicializace bude delší než jedna sekunda, měla by služba použít jednu z následujících technik inicializace:
Voláním funkce SetServiceStatus sestavíte SERVICE_RUNNING, ale dokud nebude inicializace dokončena, přijměte žádné ovládací prvky. Služba to provede voláním SetServiceStatus s dwCurrentState nastavena na SERVICE_RUNNING a dwControlsAccepted nastavena na 0 ve struktuře SERVICE_STATUS. Tím se zajistí, že SCM nebude posílat do služby žádné žádosti o řízení, než bude připraven a uvolní SCM ke správě dalších služeb. Tento přístup k inicializaci se doporučuje pro výkon, zejména pro služby automatického spuštění.
Sestava SERVICE_START_PENDING, přijmout žádné ovládací prvky a zadat nápovědu pro čekání. Pokud inicializační kód vaší služby provádí úlohy, které by měly trvat déle než počáteční hodnota nápovědy čekání, musí kód volat SetServiceStatus funkce pravidelně (pravděpodobně s upraveným tipem čekání), aby bylo možné indikovat, že probíhá průběh. Nezapomeňte volat SetServiceStatus pouze v případě, že inicializace postupuje. V opačném případě může SCM počkat, až služba vstoupí do SERVICE_RUNNING stavu za předpokladu, že vaše služba postupuje a blokuje spuštění dalších služeb. Nevolejte SetServiceStatus z samostatného vlákna, pokud si nejste jisti, že vlákno provádějící inicializaci skutečně postupuje.
Služba, která používá tento přístup, může také zadat hodnotu kontrolního bodu a pravidelně zvýšit hodnotu během zdlouhavé inicializace. Program, který službu spustil, může volat QueryServiceStatus nebo QueryServiceStatusEx získat nejnovější hodnotu kontrolního bodu z SCM a použít tuto hodnotu k hlášení přírůstkového průběhu uživateli.
Po dokončení inicializace zavolejte SetServiceStatus nastavit stav služby na SERVICE_RUNNING a určit ovládací prvky, které je služba připravena přijmout. Seznam ovládacích prvků najdete v SERVICE_STATUS struktuře.
Proveďte úlohy služby nebo pokud neexistují žádné čekající úkoly, vraťte řízení volajícímu. Jakákoli změna stavu služby zaručuje volání SetServiceStatus ohlásit nové informace o stavu.
Pokud dojde k chybě při inicializaci nebo spuštění služby, měla by služba volat SetServiceStatus nastavit stav služby na SERVICE_STOP_PENDING pokud bude vyčištění zdlouhavé. Po dokončení čištění zavolejte SetServiceStatus nastavit stav služby na SERVICE_STOPPED z posledního vlákna, které se má ukončit. Nezapomeňte nastavit dwServiceSpecificExitCode a dwWin32ExitCode členy struktury SERVICE_STATUS k identifikaci chyby.
Související témata