分享

Delphi 中操作 Windows 服务

 和谐世界 2023-07-23 发布于福建

要在 Delphi 中操作 Windows 服务,可以使用  TServiceManager  组件。以下是一个示例,展示如何开启、关闭、重启和查询 Windows 服务:

uses

  System.SysUtils, System.Classes, Winapi.Windows, Winapi.Messages, Vcl.SvcMgr;

procedure StartService(const AServiceName: string);

var

  ServiceManager: TServiceManager;

  Service: TService;

begin

  ServiceManager := TServiceManager.Create(nil);

  try

    ServiceManager.Connect;

    Service := ServiceManager.Services[AServiceName];

    if Assigned(Service) then

    begin

      if Service.Status <> TServiceStatus.Running then

      begin

        Service.Start;

        Service.WaitForStatus(TServiceStatus.Running, 5000); // 最多等待 5 秒钟

        if Service.Status <> TServiceStatus.Running then

          raise Exception.Create('启动服务失败');

      end

      else

        raise Exception.Create('服务已经在运行');

    end

    else

      raise Exception.Create('找不到指定的服务');

  finally

    ServiceManager.Free;

  end;

end;

procedure StopService(const AServiceName: string);

var

  ServiceManager: TServiceManager;

  Service: TService;

begin

  ServiceManager := TServiceManager.Create(nil);

  try

    ServiceManager.Connect;

    Service := ServiceManager.Services[AServiceName];

    if Assigned(Service) then

    begin

      if Service.Status <> TServiceStatus.Stopped then

      begin

        Service.Stop;

        Service.WaitForStatus(TServiceStatus.Stopped, 5000); // 最多等待 5 秒钟

        if Service.Status <> TServiceStatus.Stopped then

          raise Exception.Create('停止服务失败');

      end

      else

        raise Exception.Create('服务已经停止');

    end

    else

      raise Exception.Create('找不到指定的服务');

  finally

    ServiceManager.Free;

  end;

end;

procedure RestartService(const AServiceName: string);

begin

  StopService(AServiceName);

  StartService(AServiceName);

end;

function QueryServiceStatus(const AServiceName: string): TServiceStatus;

var

  ServiceManager: TServiceManager;

  Service: TService;

begin

  ServiceManager := TServiceManager.Create(nil);

  try

    ServiceManager.Connect;

    Service := ServiceManager.Services[AServiceName];

    if Assigned(Service) then

      Result := Service.Status

    else

      raise Exception.Create('找不到指定的服务');

  finally

    ServiceManager.Free;

  end;

end;

// 示例用法

begin

  try

    StartService('MyService'); // 启动指定的服务

    Writeln('服务已启动');

    // 等待一段时间,然后停止服务

    Sleep(5000);

    StopService('MyService');

    Writeln('服务已停止');

    // 等待一段时间,然后重启服务

    Sleep(5000);

    RestartService('MyService');

    Writeln('服务已重启');

    // 查询服务状态

    Writeln('服务当前状态: ', QueryServiceStatus('MyService'));

  except

    on E: Exception do

      Writeln('操作服务失败: ' + E.Message);

  end;

  Write('按 Enter 键退出...');

  Readln;

end.

在上面的示例中,我们使用  TServiceManager  组件来连接到服务控制管理器,并通过  Services  属性获取特定的服务。然后,我们可以使用  Start 、 Stop  和  WaitForStatus  方法来启动、停止和等待服务状态的变化。 QueryServiceStatus  函数用于查询服务的当前状态。

请注意,上述示例中的  MyService  是一个占位符服务名,你需要将其替换为你要操作的实际服务的名称。此外,确保在执行操作时处理可能的异常情况,并根据需要进行错误处理或输出适当的信息。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多