Widzę dziwny błąd w moim programie obsługi systemu Windows. Mój program serwisowy wywołuje StartServiceCtrlDispatcher()
na samym początku main()
, ale czasami kończy się niepowodzeniem z 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)
.Co powoduje błąd StartServiceCtrlDispatcher() z 1063 (ERROR_FAILED_SERVICE_CONTROLLER_CONNECT)?
Wiem, że ten błąd występuje, jeśli użytkownik uruchamia program ręcznie (jako program konsoli). Ale tak nie jest. Dodałem kod, aby sprawdzić macierzysty proces programu serwisowego, gdy wystąpi ten błąd, i informuje on, że services.exe jest procesem nadrzędnym (myślę, że można bezpiecznie założyć, że mój program został poprawnie uruchomiony przez SCM).
Niestety, ten błąd nie reprodukować na moim komputerze dev i nie można debugować go przez siebie, ale dzienniki błędów złapanych na systemach użytkowników mówi:
- Ten problem wydaje się stać na zaledwie kilka% z wszystkich użytkownicy tego programu.
- Nawet jeśli problem się pojawia, nie wydaje się, aby się powtórzył. Następnym razem usługa zwykle rozpoczyna się pomyślnie.
- Gdy ten problem się pojawia,
StartServiceCtrlDispatcher()
zatrzymuje się na około sekundę, zanim powróci z błędem.
Czy ktoś widział podobny błąd? Jeśli tak, jaka była przyczyna błędu?
Czy dwukrotnie sprawdziłeś, czy wywołujesz StartServiceCtrlDispatcher z głównego wątku, że jest on wywoływany w ciągu kilku sekund od rozpoczęcia procesu i czy tablica SERVICE_ENTRY_TABLE jest poprawna? (W szczególności upewnij się, że końcowy wpis to {NULL, NULL}.) –
Tak, SERVICE_ENTRY_TABLE jest poprawnie zakończony. A jeśli chodzi o czas, zapomniałem wspomnieć w oryginalnym pytaniu, ale po niepowodzeniu funkcji StartServiceCtrlDispatcher() sprawdziłem mój kod sygnatura czasowa i zwykle trwa około jednej sekundy (lub mniej) po rozpoczęciu procesu serwisowego. Tak więc myślę, że jest mało prawdopodobne, że opóźnienie powoduje błąd. –
Bardzo dziwne. Bardzo trudne do debugowania, jeśli nie można zidentyfikować wspólnego czynnika, aby można było odtworzyć problem. Jako potencjalne obejście, może mógłbyś spróbować wywołać StartServiceCtrlDispatcher() po raz drugi, jeśli pierwsze połączenie nie powiedzie się? –