要在 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 是一个占位符服务名,你需要将其替换为你要操作的实际服务的名称。此外,确保在执行操作时处理可能的异常情况,并根据需要进行错误处理或输出适当的信息。 |
|