Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создание и отладка служб Windows в Delphi 11: пошаговое руководство

Delphi , Программа и Интерфейс , Процессы и Сервисы

 

Создание службы Windows в Delphi может быть сложной задачей, особенно если вы столкнулись с проблемами, такими как состояние START_PENDING, которое не позволяет вашей службе запускаться. В этой статье мы рассмотрим основные шаги по созданию службы Windows с использованием Delphi 11 и обсудим возможные проблемы и их решения.

Шаг 1: Создание нового проекта службы Windows

  1. Создание нового проекта:
    Откройте Delphi 11 и выберите File -> New -> Other -> Delphi Projects -> Service Application.
    Введите имя для вашего проекта и выберите папку для сохранения.
  2. Настройка проекта:
    В проекте будет создан класс 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: Регистрация и запуск службы

  1. Регистрация службы:
    Используйте команду PowerShell для регистрации службы: powershell sc create TestSvc binPath= "C:ActualPathTestSvc.exe" start= demand
  2. Запуск службы:
    Используйте команду PowerShell для запуска службы: powershell sc start TestSvc

Шаг 4: Решение проблемы с состоянием START_PENDING

Если ваша служба застряла в состоянии START_PENDING, это может быть связано с тем, что TService не может запустить свой ServiceThread. Это редко встречается, но может быть вызвано проблемой с инициализацией приложения.

  1. Проверка инициализации приложения:
    Убедитесь, что Application.DelayInitialize не установлено в True. По умолчанию это значение должно быть False.
    Если вы используете /install параметр для установки службы, это может помочь решить проблему с инициализацией.
  2. Использование /install параметра:
    Запустите вашу службу с параметром /install: cmd C:ActualPathTestSvc.exe /install

  3. Изменение метода 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 22:18:10/0.0063300132751465/0