Реализация главной функции программы
В функции 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; |
- << Назад
- Вперёд
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!