niedziela, 15 lutego 2009

NSIS i usługi Windows

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? ;)

Brak komentarzy:

Prześlij komentarz