Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как запустить и остановить сервис (или получить его статус)

Delphi , Программа и Интерфейс , Процессы и Сервисы

Как запустить и остановить сервис (или получить его статус)

- Почему программисты не заливают в машину 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 then
  begin
    h_svc := OpenService(h_manager, PChar(aServiceName),
    SERVICE_START or SERVICE_QUERY_STATUS);
    if h_svc > 0 then
    begin
      temp := nil;
      if (StartService(h_svc,0,temp)) then
        if (QueryServiceStatus(h_svc,svc_status)) then
        begin
          while (SERVICE_RUNNING <> svc_status.dwCurrentState) do
          begin
            dwCheckPoint := svc_status.dwCheckPoint;
            Sleep(svc_status.dwWaitHint);
            if (not QueryServiceStatus(h_svc,svc_status)) then
              break;
            if (svc_status.dwCheckPoint < dwCheckPoint) then
            begin
              // 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 then
  begin
    h_svc := OpenService(h_manager,PChar(aServiceName),
    SERVICE_STOP or SERVICE_QUERY_STATUS);
    if h_svc > 0 then
    begin
      if(ControlService(h_svc,SERVICE_CONTROL_STOP, svc_status))then
      begin
        if(QueryServiceStatus(h_svc,svc_status))then
        begin
          while(SERVICE_STOPPED <> svc_status.dwCurrentState)do
          begin
            dwCheckPoint := svc_status.dwCheckPoint;
            Sleep(svc_status.dwWaitHint);
            if(not QueryServiceStatus(h_svc,svc_status))then
            begin
              // 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 then
  begin
    h_svc := OpenService(h_manager,PChar(sService), SERVICE_QUERY_STATUS);
    if h_svc > 0 then
    begin
      if(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 для взаимодействия с сервисами.

Вот как можно использовать эти функции:

  1. ServiceStart(aMachine, aServiceName: string): Функция запускает сервис на локальном или удаленном компьютере. Она возвращает true, если сервис работает после запуска, иначе возвращает false.
  2. ServiceStop(aMachine, aServiceName: string): Функция останавливает сервис на локальном или удаленном компьютере. Она возвращает true, если сервис остановлен после остановки, иначе возвращает false.
  3. ServiceGetStatus(sMachine, sService: string): Функция получает статус сервиса на локальном или удаленном компьютере. Она возвращает один из следующих констант:
    • SERVICE_STOPPED
    • SERVICE_RUNNING
    • SERVICE_PAUSED
    • SERVICE_START_PENDING
    • SERVICE_STOP_PENDING
    • SERVICE_CONTINUE_PENDING
    • SERVICE_PAUSE_PENDING

Чтобы использовать эти функции, вам нужно включить в ваш проект Delphi единицу WinSvc.

Вот пример использования этих функций:

uses
  WinSvc;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  if ServiceStart('localhost', 'MyService') then
    ShowMessage('Сервис запущен')
  else
    ShowMessage('Ошибка запуска сервиса');
end;

procedure TForm1.ButtonStopClick(Sender: TObject);
begin
  if ServiceStop('localhost', 'MyService') then
    ShowMessage('Сервис остановлен')
  else
    ShowMessage('Ошибка остановки сервиса');
end;

В этом примере процедуры ButtonStartClick и ButtonStopClick запускают и останавливают сервис с именем "MyService" на локальном компьютере. Результат каждого операции отображается в сообщении.

Обратите внимание, что вам нужно заменить 'localhost' на UNC-путь или имя удаленного компьютера, если сервис не находится на локальном компьютере. Также замените 'MyService' на имя вашего сервиса.

Представлено описание функций для управления Windows-сервисами: запуск, остановка и получение статуса.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:57:37/0.0058419704437256/1