При разработке сервисов Windows в Delphi пользователи иногда сталкиваются с проблемой, когда сервис не запускается, и в консоли появляется ошибка "service name not found". В данной статье мы рассмотрим типичные проблемы, которые могут привести к такой ошибке, и шаги по их устранению.
Проблема и её описание
Разработчик создал новый проект Windows Service с использованием мастера, добавил некоторый код, скомпилировал проект, запустил его с параметром /INSTALL, но попытка запуска сервиса командой net start myservice привела к ошибке "service name not found". При попытке запуска через Панель управления в разделе Сервисы, ссылка "Start" приводит к зависанию окна запуска на 50% прогресс-бара. В тестовых целях был добавлен Timer, который должен был выводить текущее время каждую минуту.
Анализ кода
В файле DPR присутствует стандартный код инициализации приложения:
begin
if not Application.DelayInitialize or Application.Installing then
begin
Application.Initialize;
end;
Application.CreateForm(TZeusUpdateService, ZeusUpdateService);
Application.Run;
end.
В файле PAS определены процедуры и функции управления сервисом, в том числе ServiceStart, где запущен Timer1 и бесконечный цикл обработки запросов:
procedure TZeusUpdateService.ServiceStart(Sender: TService; var Started: Boolean);
begin
Timer1.Enabled := True;
while not Terminated do ServiceThread.ProcessRequests(True);
Timer1.Enabled := False;
end;
Подтвержденный ответ и устранение проблемы
В коде сервиса обнаружены следующие ошибки:
В событии ServiceStart присутствует бесконечный цикл, который должен выполняться в событии OnExecute, а не ServiceStart.
Вызов ShowMessage в сервисе не допустим, так как сервисы не могут взаимодействовать с пользовательским интерфейсом.
Чтобы исправить проблему, необходимо перенести бесконечный цикл обработки запросов в событие OnExecute и использовать невизуальные механизмы для обратной связи.
Шаги по исправлению
Удалите бесконечный цикл из события ServiceStart. Если сервис не выполняет никаких действий в фоновом режиме, то OnExecute можно не определять, и сервис будет автоматически обрабатывать запросы от SCM.
Уберите вызов ShowMessage, так как он не работает в сервисах.
Активируйте TTimer в событии ServiceStart и деактивируйте его в событии OnStop.
Альтернативный подход
Вместо бесконечного цикла можно использовать периодический вызов функции ProcessRequests(False) с ожиданием через Sleep() для предотвращения загрузки процессора.
Используя эти рекомендации, вы сможете устранить ошибку "service name not found" и успешно запустить ваш сервис Windows в Delphi.
Устранение ошибки 'service name not found' при работе с Windows Service в Delphi включает корректировку кода инициализации сервиса и перемещение бесконечного цикла обработки запросов в событие `OnExecute`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS