Страница 4 из 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
|