Czemu nie mogę zatrzymać usługi?

0

Cześć, mam własną usługę. Instaluję ją poprzez:
usluga.exe /install

Potem ją uruchamiam.

Chcę ją zatrzymać z wiersza polecenia. Znalazłem info o sc.exe

Więc robię:
sc stop usluga

ale dostaję komunikat:
[SC] OpenService Failed 1060

Mam też kod w Delphi, który powinien zatrzymać usługę. Wygląda tak:

h_manager:=OpenSCManager(PChar(aMachine),nil, 
                           SC_MANAGER_CONNECT); 
  if h_manager > 0 then 
  begin 
    h_svc := OpenService(h_manager,PChar(aServiceName), 
                         SERVICE_STOP or SERVICE_QUERY_STATUS); 

    if h_svc > 0 then 
    begin 
      if(ControlService(h_svc,SERVICE_CONTROL_STOP, 
                        svc_status))then 
      begin 
        if(QueryServiceStatus(h_svc,svc_status))then 
        begin 
          while(SERVICE_STOPPED <> svc_status.dwCurrentState)do 
          begin 
            dwCheckPoint := svc_status.dwCheckPoint; 
            Sleep(svc_status.dwWaitHint); 

            if(not QueryServiceStatus(h_svc,svc_status))then 
            begin 
              // couldn't check status 
              break; 
            end; 

            if(svc_status.dwCheckPoint < dwCheckPoint)then 
              break; 

          end; 
        end; 
      end; 
      CloseServiceHandle(h_svc); 
    end; 
    CloseServiceHandle(h_manager); 
  end; 

  Result := SERVICE_STOPPED = svc_status.dwCurrentState;

Okazuje się, że zmienna h_svc ma wartość zero, a więc nie powiodła się funkcja OpenService.

Czytałem o tym w necie, ale nie znalazłem żadnej satysfakcjonującej mnie odpowiedzi. Ktoś miał podobny problem?

0

Naucz się korzystać z GetLastError i FormatMessage - jedna z podstaw WINAPI... Komunikat dla tego kodu błędu brzmi tak:

Okreśona usługa nie istnieje jako usługa zainstalowana.

Poza tym zamiast 'sc' możesz używać 'net', powinien dawać czytelniejsze komunikaty - 'net stop usługa'.

0
deus. napisał(a)

Naucz się korzystać z GetLastError i FormatMessage - jedna z podstaw WINAPI... Komunikat dla tego kodu błędu brzmi tak:

Okreśona usługa nie istnieje jako usługa zainstalowana.

Poza tym zamiast 'sc' możesz używać 'net', powinien dawać czytelniejsze komunikaty - 'net stop usługa'.

OK, czemu wyskakuje taki komunikat, skoro usługa jest instalowana, tak jak napisałem? Czyli exe z parametrem /install?

net stop usluga działa i ładnie zatrzymuje. Teraz rodzi się kolejne pytanie - jaka jest różnica pomiędzy net i sc?

0

OK, czemu wyskakuje taki komunikat, skoro usługa jest instalowana, tak jak napisałem? Czyli exe z parametrem /install?

Widocznie nie była zainstalowana albo pomyliłeś się podając nazwę.

Teraz rodzi się kolejne pytanie - jaka jest różnica pomiędzy net i sc?

MSDN ci powie. SC ma więcej opcji i służy tylko do sterowania usługami (skrót - service controller)

0
othello napisał(a)

OK, czemu wyskakuje taki komunikat, skoro usługa jest instalowana, tak jak napisałem? Czyli exe z parametrem /install?

Widocznie nie była zainstalowana albo pomyliłeś się podając nazwę.

Żeby była jasność.
uruchomiłem z wiersza poleceń:
usluga.exe /install

Wcześniej zrobiłem sobie skrót do tego pliku z parametrem install. No nie ma bata, żeby się pomylić.

1

No dobra, ale to Twoja usluga, sam sobie napisales obsluge z wiersza polecen przelacznika /install, pewnie jest zle napisana i nie instaluje uslugi poprawnie.

0
johny_bravo napisał(a)

No dobra, ale to Twoja usluga, sam sobie napisales obsluge z wiersza polecen przelacznika /install, pewnie jest zle napisana i nie instaluje uslugi poprawnie.

Nie. Z tego, co wiem to ma w standardzie każda usługa. Parametry /install i /uninstall. A przynajmniej te pisane w Delphi. I programowanie tych parametrów w ogóle nas nie interesuje.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.