Sława!
Dziś w ramach akcji ratowania doświadczenia przed sklerozą własną, zapiszę sobie jak z poziomu NSIS (podbudowa do tworzenia instalatorów dla aplikacji Windows), a nóż widelec i potomność będzie miała z tej notatki pożytek jakowyś.
Takowoż więc do obsługi usług potrzebujemy wtyczki Service Control Management (nsSCM). Wtyczka ta umożliwia na następujące operacje na usługach:
- Install - zarejstrowanie usługi
- Start - uruchomienie usługi
- Stop - zatrzymanie usługi
- QueryStatus - odpytanie o aktualny stan usługi
- Remove - wyrejestrowanie usługi
Używanie jest banalnie proste, gdyż poza rejestrowaniem usługi, sprowadza się do wywołania odpowiedniej funkcji wtyczki z podaniem nazwy usługi, a następnie zczytania wyniku operacji. Jakiś przykład? Proszę bardzo, niech będzie nim wyłączenie/włączenie usługi w zależności od jej aktualnego stanu.
Zaczniemy od odpytania o stan usługi poleceniem:
nsSCM::QueryStatus /NOUNLOAD nazwa_usługi
Polecenie to, oprócz informacji o powodzeniu/błędzie wywołania, zwróci nam stan usługi. Możliwe wartości to:
- 1 - usługa zatrzymana
- 2 - usługa w trakcie uruchamiania
- 3 - usługa w trakcie zatrzymywania
- 4 - usługa uruchomiona
- 5 - usługa w trakcie wznawiania
- 6 - usługa w trakcie wstrzymywania
- 7 - usługa wstrzymana
Załóżmy, że będziemy uruchamiać usługę, jeżeli jest zatrzymana lub wstrzymana, natomiast zatrzymywać jeżeli uruchomiona, pozastałe stany poprostu zignorujemy. Do zatrzymania usługi wykorzystamy kod:
nsSCM::Stop nazwa_usługi
Do uruchomienia natomiast:
nsSCM::Start nazwa_usługi
Tak więc nasz kod powinien uzyskać postać podobną do poniższej:
nsSCM::QueryStatus nazwa_usługi
Pop $0
${If} $0 == "success"
Pop $1
${Switch} $1
;Usługa jest zatrzymana
${Case} 1
;Usługa jest wstrzymana
${Case} 7
;Uruchamiamy usługę
nsSCM::Start <nazwa_usługi>
Pop $2
${If} $2 == "success"
MessageBox MB_OK "Usługa uruchomiona"
${Else}
MessageBox MB_ICONEXCLAMATION|MB_OK "Błąd uruchamiania"
${EndIf}
${Break}
;Usługa jest uruchomiona
${Case} 4
;Wstrzymujemy usługę
nsSCM::Stop <nazwa_usługi>
Pop $2
${If} $2 == "success"
MessageBox MB_OK "Usługa zatrzymana"
${Else}
MessageBox MB_ICONEXCLAMATION|MB_OK "Błąd zatrzymywania"
${EndIf}
${Break}
${EndSwitch}
${EndIf}
Widzimy, więc, że usługi nie gryzą (przynajmniej nie za często ;)) i zostało nam tylko napisać aplikację, dzięki której możliwości nsSCM będziemy mogli wykorzystać, a to przecież dla nas pryszcz, co nie? ;)