Главная » Статьи » Программирование в Delphi |
Написание сервисов Windows NT на WinAPI в Delphi
program Project1; uses Windows,WinSvc; {$R *.res} begin end. На этом подготовительный этап закончен - начинаем писать сервис. Главная часть программы Как уже отмечалось - сервис это обычная программа. Программа в Pascal'е находится между begin и end. После запуска нашего сервиса (здесь и далее под запуском сервиса понимается именно запуск его из Менеджера сервисов, а не просто запуск exe'шника сервиса) менеджер сервисов ждет пока наш сервис вызовет функцию StartServiceCtrlDispatcher.Ждать он будет недолго - если в нашем exe'шнике несколько сервисов то секунд 30, если один - около секунды, поэтому помещаем вызов StartServiceCtrlDispatcher поближе к begin. StartServiceCtrlDispatcher качестве аргумента требует _SERVICE_TABLE_ENTRYA, поэтому добавляем в var DispatchTable : array [0..кол-во сервисов] of _SERVICE_TABLE_ENTRYA; и заполняем этот массив (естественно перед вызовом StartServiceCtrlDispatcher). Т.к. в нашем ехешнике будет 1 сервис, то заполняем его так : DispatchTable[0].lpServiceName:=ServiceName; DispatchTable[0].lpServiceProc:=@ServiceProc; DispatchTable[1].lpServiceName:=nil; DispatchTable[1].lpServiceProc:=nil; Советую завести константы ServiceName - имя сервиса и ServiceDisplayName - отображаемое имя. ServiceProc - основная функция сервиса(о ней ниже), а в функцию мы передаем ее адрес. В DispatchTable[кол-во сервисов] все равно nil - это показывает функции, что предыдущее поле было последним. У меня получилось так : begin DispatchTable[0].lpServiceName:=ServiceName; DispatchTable[0].lpServiceProc:=@ServiceProc; DispatchTable[1].lpServiceName:=nil; DispatchTable[1].lpServiceProc:=nil; if not StartServiceCtrlDispatcher(DispatchTable[0]) then LogError('StartServiceCtrlDispatcher Error'); end. StartServiceCtrlDispatcher выполнится только после того, как все сервисы будут остановлены. Функция LogError протоколирует ошибки - напишите ее сами. Источник: http://www.cyberguru.ru/programming/delphi/windowsnt-services-winapi.html | |
Просмотров: 1814 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |