Вам никогда не нужно использовать ExitProcess()
, чтобы остановить службу. На самом деле, вам никогда не нужно использовать ExitProcess()
вообще.
Сервисы тесно связаны с SCM, и если сервис, который, по его мнению, должен работать, просто исчезает, он предпримет некоторые действия для его восстановления. В крайних случаях это приведет к перезагрузке системы.
Правильный способ остановить службу - это использовать документированный API, чтобы попросить SCM попросить службу остановить. Для завершения этого процесса часто требуется несколько секунд, поскольку самой службе обычно требуется полное отключение после того, как ее рабочие потоки завершили работу и остановились.
Привилегии, необходимые для взаимодействия с SCM, менее опасны, чем те, которые требуются для завершения произвольного процесса, но обычно они не предоставляются вне группы «Администраторы».
Редактировать: Комментарий спросил об остановке службы изнутри.
Это может быть сложный вызов, особенно если служба находится в каком-то неудачном состоянии. Служба и SCM должны согласиться с тем, что служба останавливается, или SCM предпримет действие по восстановлению, настроенное для службы.
У меня есть полная реализация службы, которая может служить альтернативной точкой зрения на то, как справляться с некоторыми из этих вещей. Это LuaService и является платформой, которая позволяет (однопоточному) сервису быть реализованным в чистом Lua помимо самого исполняемого файла LuaService. В справочном руководстве делается попытка полностью документировать внутренние компоненты, а также документировать некоторые детали срока службы службы, которые в противном случае были задокументированы посредством взаимодействия различных статей в MSDN.