Написание сервисов Windows NT на WinAPI
Страница 4. Реализация главной функции


 

Реализация главной функции

В функции ServiceMain (см.там, где отмечено) пишем код сервиса. Так как сервис обычно постоянно находится в памяти компьютера, то скорее всего код будет находиться в цикле. Например в таком :

repeat
Что-нибудь делаем пока сервис не завершится.
until ServiceStatus.dwCurrentState = SERVICE_STOPPED;

Но это пройдет если сервис не обрабатывает сообщения приостановки/перезапуска, иначе сервис никак не прореагирует. Другой вариант :

repeat 
if ServiceStatus.dwCurrentState <> SERVICE_PAUSED
then чего-то делаем
until ServiceStatus.dwCurrentState = SERVICE_STOPPED;

И третий, имхо, самый правильный вариант = использование потока :
Пишем функцию

function MainServiceThread(p:Pointer):DWORD;stdcall;
begin
что-то делаем
end;

и в ServiceMain создаем поток

var
ThID : Cardinal;

hThread:=CreateThread(nil,0,@MainServiceThread,nil,0,ThID);
и ждем его завершения
WaitForSingleObject(hThread,INFINITE);
закрывая после этого его дескриптор
CloseHandle(hThread);

При этом hThread делаем глобальной переменной.
Теперь при приостановке сервиса (в Handler) делаем так

 SERVICE_CONTROL_PAUSE :
begin
ServiceStatus.dwCurrentState := SERVICE_PAUSED;
SuspendThread(hThread); // приостанавливаем поток
end;

и при возобновлении работы сервиса

 SERVICE_CONTROL_CONTINUE :
begin
ServiceStatus.dwCurrentState := SERVICE_RUNNING;
ResumeThread(hThread); // возобновляем поток
end;


delphi.xonix.ru

 
« Предыдущая статья