2013-09-03 5 views
8

Stworzyłem usługę Windows z Delphi i użyłem dwóch metod instalacji, uruchamiania i zatrzymywania.Usługa nie uruchamia się

Metoda 1

jeśli mogę zainstalować tę usługę za pomocą wiersza poleceń

C:\MyService\ServiceApp.exe /Install 

zainstalowany pomyślnie i mogę uruchomić i zatrzymać zbyt w konsoli usług.

Metoda 2

ale jeśli instalacja tej samej usługi z inną nazwą pomocą SC np

C:\Windows\system32>sc create myservice binpath= c:\MyService\ServiceApp.exe 

widzę jest on zainstalowany, ale nie mogę uruchomić usługę za pomocą konsoli usług jak z

sc start myservice 

kiedy robię zapytania przy użyciu SC, wynikiem są następujące

C:\Windows\system32>sc query myservice 

SERVICE_NAME: myservice 
     TYPE    : 10 WIN32_OWN_PROCESS 
     STATE    : 2 START_PENDING 
           (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) 
     WIN32_EXIT_CODE : 0 (0x0) 
     SERVICE_EXIT_CODE : 0 (0x0) 
     CHECKPOINT   : 0x0 
     WAIT_HINT   : 0x7d0 

Do tej pory używałem/Install ale chcę zainstalować tę samą usługę wiele razy o różnych nazwach, mam pomysł wykorzystania tego postu. (How to install a windows service from command line specifying name and description?) Czy ktoś może wyjaśnić różnicę w zachowaniu między/Zainstaluj i SC?

+0

Jeśli możesz pokazać nam kod, który instalujesz, a także który go uruchamia, być może będziemy mogli Ci pomóc. –

+1

Aby zainstalować: sc utwórz myservice binpath = c: \ serviceapp \ ServiceApp.exe , aby rozpocząć: sc uruchom myservice lub po prostu uruchom konsolę serwisową – Girish

+0

Edytuj pytanie, aby uwzględnić te ważne informacje, a nie komentarze. –

Odpowiedz

13

Zderzyłeś się z błędem w implementacji TService, patrz QC#79781. Delphi nie może uruchomić usługi, jeśli nazwa usługi jest inna niż TService.Name.

Można jednak uniknąć tego ograniczenia, dostosowując TService.Name przed uruchomieniem usługi. Dobrym pomysłem jest wydarzenie TService.OnCreate. Musisz znać prawdziwą nazwę usługi, więc musisz przekazać ją jako argument do usługi exe (dodając ją do binpath komendy sc create).

Utwórz usługę:

sc create myservice1 binpath= "c:\MyService\ServiceApp.exe myservice1" 
sc create myservice2 binpath= "c:\MyService\ServiceApp.exe myservice2" 

Ustaw nazwę:

procedure TMyService.ServiceCreate(Sender: TObject); 
begin 
    if (System.ParamCount >= 1) and not CharInSet(ParamStr(1)[1], SwitchChars) then 
    Name := ParamStr(1); 
end; 

Jest to nieco prymitywny sposób przetwarzania argumentów, ale jest ok, jako przykład. Jeśli pierwszy argument nie rozpoczyna się od / lub -, zakłada, że ​​jest to nazwa podana.

Uwaga:

Innym ograniczeniem TService jest to, że nie można utworzyć usługi (używając /install) z argumentów w swojej linii poleceń, ponieważ używa ParamStr(0) jako binpath.

+1

Dobra robota! Próbowałem dowiedzieć się, dlaczego SC był w stanie uruchomić usługę, gdy jest używany z prawdziwym imieniem. –

+2

@Sertac: Wygląda na to, że ten błąd jest spowodowany przez system Delphi, który umożliwia udostępnianie wielu 'TService's' w jednym exe. Myślę, że jednym prostym rozwiązaniem będzie nie sprawdzanie "nazwy", gdy jest tylko jedna TService. – JRL