Создание службы Windows в Delphi может быть сложной задачей, особенно если вы столкнулись с проблемами, такими как состояние START_PENDING, которое не позволяет вашей службе запускаться. В этой статье мы рассмотрим основные шаги по созданию службы Windows с использованием Delphi 11 и обсудим возможные проблемы и их решения.
Шаг 1: Создание нового проекта службы Windows
Создание нового проекта:
Откройте Delphi 11 и выберите File -> New -> Other -> Delphi Projects -> Service Application.
Введите имя для вашего проекта и выберите папку для сохранения.
Настройка проекта:
В проекте будет создан класс TService1, который является основным классом для вашей службы.
Убедитесь, что все методы, такие как ServiceStart, ServiceStop, ServiceExecute, ServiceContinue и ServicePause, правильно связаны с событиями TService.
Шаг 2: Написание кода для службы
Вот пример базовой службы, которая просто запускается и спит в цикле до тех пор, пока её не остановят:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
WinSvc, Service;
type
TService1 = class(TService)
procedure ServiceController(CtrlCode: DWord); stdcall;
function GetServiceController: TServiceController;
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Service1: TService1;
implementation
{$R *.dfm}
procedure TService1.ServiceController(CtrlCode: DWord); stdcall;
begin
Service1.Controller(CtrlCode);
end;
function TService1.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TService1.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
Continued := True;
end;
procedure TService1.ServiceExecute(Sender: TService);
begin
while not Terminated do
begin
ServiceThread.ProcessRequests(False); // Обработка запросов от SCM
TThread.Sleep(1000); // Ожидание 1 секунду
end;
end;
procedure TService1.ServicePause(Sender: TService; var Paused: Boolean);
begin
Paused := True;
end;
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
// Логирование начала службы
TFile.AppendAllText('log.txt', 'ServiceStart tries to initialize PeriodicThread...');
Started := True;
end;
procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Stopped := True;
end;
end.
Шаг 3: Регистрация и запуск службы
Регистрация службы:
Используйте команду PowerShell для регистрации службы: powershell sc create TestSvc binPath= "C:ActualPathTestSvc.exe" start= demand
Запуск службы:
Используйте команду PowerShell для запуска службы: powershell sc start TestSvc
Шаг 4: Решение проблемы с состоянием START_PENDING
Если ваша служба застряла в состоянии START_PENDING, это может быть связано с тем, что TService не может запустить свой ServiceThread. Это редко встречается, но может быть вызвано проблемой с инициализацией приложения.
Проверка инициализации приложения:
Убедитесь, что Application.DelayInitialize не установлено в True. По умолчанию это значение должно быть False.
Если вы используете /install параметр для установки службы, это может помочь решить проблему с инициализацией.
Использование /install параметра:
Запустите вашу службу с параметром /install: cmd C:ActualPathTestSvc.exe /install
Изменение метода ServiceExecute:
Убедитесь, что в методе ServiceExecute вызывается ServiceThread.ProcessRequests(False), чтобы обрабатывать запросы от SCM.
Шаг 5: Добавление рабочего потока
Если ваша служба должна выполнять какую-либо работу, вы можете добавить рабочий поток в метод ServiceStart:
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
// Логирование начала службы
TFile.AppendAllText('log.txt', 'ServiceStart tries to initialize PeriodicThread...');
// Создание рабочего потока
PeriodicThread := TThread.CreateAnonymousThread(
procedure
begin
while not Terminated do
begin
// Ваша логика работы службы
TThread.Sleep(1000);
end;
end
);
PeriodicThread.Start;
Started := True;
end;
Шаг 6: Остановка рабочего потока
Убедитесь, что рабочий поток останавливается в методе ServiceStop:
procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
// Остановка рабочего потока
PeriodicThread.Terminate;
PeriodicThread.WaitFor;
Stopped := True;
end;
Заключение
Создание и отладка службы Windows в Delphi может быть сложной задачей, но с правильным подходом и пониманием основных принципов, вы сможете успешно создать надёжную службу. Если вы столкнулись с проблемами, связанными с состоянием START_PENDING, попробуйте использовать параметр /install для установки службы и убедитесь, что ваш рабочий поток правильно останавливается в методе ServiceStop.
Надеюсь, эта статья поможет вам успешно создать и отладить службу Windows в Delphi 11. Удачи в разработке!
Статья описывает создание службы Windows в Delphi 11, включая шаги по регистрации, запуску и устранению проблем, таких как состояние START_PENDING.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.