Здравствуйте!
В проекте возникла необходимость сделать так, чтобы Служба реагировала на команду остановки (SERVICE_CONTROL_STOP) только при определенных условиях (грубо говоря, когда все клиенты отключены от нее).
При реализации этой задачи сразу столкнулся со следующей проблемой: после 2-й попытки остановки Службы она останавливается независимо ни от каких условий.
В качестве тестовой Службы взял код службы voidsvc из
http://rsdn.ru/article/?baseserv/svcadmin-1.xmlАвтор(ы): Александр Федотов
Дата: 24.03.2002
В статье рассматриваются вопросы управления системными
службами Windows NT: чтение и изменение конфигурации, запуск и
остановка, установка и удаление служб. В статье описана большинство
функций управления службами, использование каждой функции
продемонстрировано примерами.
и видоизменил реакцию этой службы на команду остановки:
...
case SERVICE_CONTROL_STOP:
break;
...
После первой команды остановки реакция Службы адекватная: она игнорирует эту команду, состояние Службы остается RUNNING. Но после второй подачи этой команды процесс Службы завершается, даже не попадая в функцию обработки команд (проверял, подключившись отладчиком к процессу Службы). Точнее, на команду "sc stop void" получаем "[SC] ControlService FAILED 1061".
Пробовал и такой обработчик команды остановки:
...
case SERVICE_CONTROL_STOP:
_Status.dwCurrentState = SERVICE_RUNNING;
_VERIFY(SetServiceStatus( _hStatus, &_Status ) );
break;
...
результат тот-же.
ОС WinXP SP2.
Если кто-то сталкивался с подобной проблемой и может что-то посоветовать, буду очень признателен.
Спасибо.
И все же пришлось еще раз вернуться к этой проблеме. Метод, с флагом SERVICE_ACCEPT_STOP до некоторых пор устраивал, но теперь необходимо именно в обработчике SERVICE_CONTROL_STOP производить проверки и в зависимости от результатов этих проверок завершать или не завершать службу. Т.о., возвращаюсь к исходному вопросу: почему после первой подачи команды Stop службе на все последующие команды SCM отвечает кодом "[SC] ControlService: ошибка: 1061: Служба в настоящее время не может принимать команды."? На повторную же команду Stop служба вообще завершается, минуя обработчик SERVICE_CONTROL_STOP. Информация о службе, которую я тестировал в стартовом сообщении темы.
Заранее спасибо.