Содержание материала

 

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

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

Code:

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;

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить