Delphi: службы

КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"

[Главная страница] [Delphi] [Контакты]

Пример проекта службы


Попробуем создать демонстрационный проект простейшего сервиса для ОС Windows NT. Для этого откроем диалоговое окно New Items и на странице New дважды щелкнем по пиктограмме Service Application.

s1-1

В результате Delphi создаст шаблон проекта службы с одним сервисом.

Начнем работу с конфигурирования сервиса. Для этого выберем модуль Service1 и внесем ряд изменений в его свойства:

Тип сервиса: ServiceType:=stWin32;
Интерактивность: Interactive:=true;
Имя сервиса: Name:=DemoService;
Название: DisplayName:=Демонстрация сервиса;
Тип старта: StartType:=stManual;
Реакция на ошибки при старте: ErrorSeverity:=esIgnory;

Сохраните проект в отдельном каталоге, при этом модуль службы назовите DemoSrv.pas, а весь проект – dmsrv.dpr. В секции частных объявлений модуля DemoSrv.pas опишем две переменные:

type
  TDemoService = class(TService)
  ...
  private
    { Private declarations }
    dc: HDC;    // контекст устройства
    counter: Integer; // счетчик

В момент старта сервиса получаем контекст дисплея и обнуляем счетчик:

procedure TDemoService.ServiceStart(Sender: TService; var Started: Boolean);
begin
  dc := CreateDC('DISPLAY', nil, nil, nil);
  counter := 0;
end;

Переходим к описанию события OnExecute() сервиса. О факте работы сервиса информируем пользователя текстовой строкой, в которой выводим текущее значение счетчика. Служба остановится в случае, когда счетчик превысит значение 100 или по команде от внешней управляющей программы. Для этого внутри цикла с помощью ProcessRequests() регулярно производим асинхронный опрос менеджера служб на предмет поступления команд от внешних приложений.

procedure TDemoService.ServiceExecute(Sender: TService);
var
  s: string;
begin
  repeat
    s := Format('%s %d', [DemoService.DisplayName, counter]);
    TextOut(dc, 10, 10, PChar(s), Length(s));
    Sleep(180);
    Inc(counter);
    ServiceThread.ProcessRequests(False);
  until (terminated = true) or (Counter > 100);
end;

Обращаю внимание, что вывод текстовой строки на экран возможен только в случае, когда сервис работает в интерактивном режиме. Событие остановки используем для освобождения дескриптора контекста устройства:

procedure TDemoService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  MessageBeep(0);
  DeleteDC(dc);
end;

Регистрация службы средствами приложения

Для регистрации службы в операционной системе владеющее службой приложение должно быть запущено из командной строки с ключом /INSTALL. Например:

C:\DemoService\dmsrv.exe /install

Для снятия с регистрации применяют ключ /UNINSTALL. Процесс установки сервиса сопровождается выводом уведомляющего сообщения. Для отказа от показа окна уведомления используйте ключ /SILENT. Откройте консоль управления службами компьютера, найдите в ней наш сервис «Демонстрация сервиса» и запустите его на выполнение…

Источник: Д.Осипов - Delphi. Профессиональное программирование.

Исходный код примера здесь. Выполнен на Delphi XE.