Как запустить и остановить сервис (или получить его статус)
- Почему программисты не заливают в машину 95-й бензин?
- Боятся, что повиснет.
Здесь представлены две функции ServiceStart и ServiceStop, которые показывают, как пользоваться API функциями OpenSCManager, OpenService и т.д.:
function ServiceStart(aMachine, aServiceName: string ): boolean;
// aMachine это UNC путь, либо локальный компьютер если пустоvar
h_manager,h_svc: SC_Handle;
svc_status: TServiceStatus;
Temp: PChar;
dwCheckPoint: DWord;
begin
svc_status.dwCurrentState := 1;
h_manager := OpenSCManager(PChar(aMachine), nil, SC_MANAGER_CONNECT);
if h_manager > 0 thenbegin
h_svc := OpenService(h_manager, PChar(aServiceName),
SERVICE_START or SERVICE_QUERY_STATUS);
if h_svc > 0 thenbegin
temp := nil;
if (StartService(h_svc,0,temp)) thenif (QueryServiceStatus(h_svc,svc_status)) thenbeginwhile (SERVICE_RUNNING <> svc_status.dwCurrentState) dobegin
dwCheckPoint := svc_status.dwCheckPoint;
Sleep(svc_status.dwWaitHint);
if (not QueryServiceStatus(h_svc,svc_status)) then
break;
if (svc_status.dwCheckPoint < dwCheckPoint) thenbegin// QueryServiceStatus не увеличивает dwCheckPoint
break;
end;
end;
end;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
Result := SERVICE_RUNNING = svc_status.dwCurrentState;
end;
function ServiceStop(aMachine,aServiceName: string ): boolean;
// aMachine это UNC путь, либо локальный компьютер если пустоvar
h_manager, h_svc: SC_Handle;
svc_status: TServiceStatus;
dwCheckPoint: DWord;
begin
h_manager:=OpenSCManager(PChar(aMachine),nil, SC_MANAGER_CONNECT);
if h_manager > 0 thenbegin
h_svc := OpenService(h_manager,PChar(aServiceName),
SERVICE_STOP or SERVICE_QUERY_STATUS);
if h_svc > 0 thenbeginif(ControlService(h_svc,SERVICE_CONTROL_STOP, svc_status))thenbeginif(QueryServiceStatus(h_svc,svc_status))thenbeginwhile(SERVICE_STOPPED <> svc_status.dwCurrentState)dobegin
dwCheckPoint := svc_status.dwCheckPoint;
Sleep(svc_status.dwWaitHint);
if(not QueryServiceStatus(h_svc,svc_status))thenbegin// couldn't check status
break;
end;
if(svc_status.dwCheckPoint < dwCheckPoint)then
break;
end;
end;
end;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
Result := SERVICE_STOPPED = svc_status.dwCurrentState;
end;
Чтобы узнать состояние сервиса, используйте следующую функцию:
function ServiceGetStatus(sMachine, sService: string ): DWord;
var
h_manager, h_service: SC_Handle;
service_status: TServiceStatus;
hStat: DWord;
begin
hStat := 1;
h_manager := OpenSCManager(PChar(sMachine) ,nil, SC_MANAGER_CONNECT);
if h_manager > 0 thenbegin
h_svc := OpenService(h_manager,PChar(sService), SERVICE_QUERY_STATUS);
if h_svc > 0 thenbeginif(QueryServiceStatus(h_svc, service_status)) then
hStat := service_status.dwCurrentState;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
Result := hStat;
end;
Она возвращает одну из следующих констант:
SERVICE_STOPPED
SERVICE_RUNNING
SERVICE_PAUSED
SERVICE_START_PENDING
SERVICE_STOP_PENDING
SERVICE_CONTINUE_PENDING
SERVICE_PAUSE_PENDING
Всё что, что Вам нужно, это unit WinSvc!
Приведенный код - это единица Delphi, содержащая три функции для управления Windows-сервисами: ServiceStart, ServiceStop и ServiceGetStatus. Эти функции используют API OpenSCManager, OpenService, StartService, QueryServiceStatus и ControlService из Windows API для взаимодействия с сервисами.
Вот как можно использовать эти функции:
ServiceStart(aMachine, aServiceName: string): Функция запускает сервис на локальном или удаленном компьютере. Она возвращает true, если сервис работает после запуска, иначе возвращает false.
ServiceStop(aMachine, aServiceName: string): Функция останавливает сервис на локальном или удаленном компьютере. Она возвращает true, если сервис остановлен после остановки, иначе возвращает false.
ServiceGetStatus(sMachine, sService: string): Функция получает статус сервиса на локальном или удаленном компьютере. Она возвращает один из следующих констант:
SERVICE_STOPPED
SERVICE_RUNNING
SERVICE_PAUSED
SERVICE_START_PENDING
SERVICE_STOP_PENDING
SERVICE_CONTINUE_PENDING
SERVICE_PAUSE_PENDING
Чтобы использовать эти функции, вам нужно включить в ваш проект Delphi единицу WinSvc.
В этом примере процедуры ButtonStartClick и ButtonStopClick запускают и останавливают сервис с именем "MyService" на локальном компьютере. Результат каждого операции отображается в сообщении.
Обратите внимание, что вам нужно заменить 'localhost' на UNC-путь или имя удаленного компьютера, если сервис не находится на локальном компьютере. Также замените 'MyService' на имя вашего сервиса.
Представлено описание функций для управления Windows-сервисами: запуск, остановка и получение статуса.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.