КОМПЬЮТЕРНЫЕ КУРСЫ "ПОИСК"
[Главная страница] [Delphi] [Контакты]
Попробуем создать демонстрационный проект простейшего сервиса для ОС Windows NT. Для этого откроем диалоговое окно New Items и на странице New дважды щелкнем по пиктограмме Service Application.
В результате 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.