unit ServiceManager;interfaceuses SysUtils, Windows, WinSvc;type TServiceManager = class private { Private declarations } ServiceControlManager: SC_Handle; ServiceHandle: SC_Handle; protected function DoStartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean; public { Public declarations } function Connect(MachineName: PChar = nil; DatabaseName: PChar = nil; Access: DWORD = SC_MANAGER_ALL_ACCESS): Boolean; // Access may be SC_MANAGER_ALL_ACCESS function OpenServiceConnection(ServiceName: PChar): Boolean; function StartService: Boolean; overload; // Simple start function StartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean; overload; // More complex start function StopService: Boolean; procedure PauseService; procedure ContinueService; procedure ShutdownService; procedure DisableService; function GetStatus: DWORD; function GetStatusCn: string; function ServiceRunning: Boolean; function ServiceStopped: Boolean; end;implementation{ TServiceManager }function TServiceManager.Connect(MachineName, DatabaseName: PChar; Access: DWORD): Boolean; begin { open a connection to the windows service manager } ServiceControlManager := OpenSCManager(MachineName, DatabaseName, Access); Result := (ServiceControlManager <> 0); end; function TServiceManager.OpenServiceConnection(ServiceName: PChar): Boolean; begin { open a connetcion to a specific service } ServiceHandle := OpenService(ServiceControlManager, ServiceName, SERVICE_ALL_ACCESS); Result := (ServiceHandle <> 0); end;procedure TServiceManager.PauseService; var ServiceStatus: TServiceStatus; begin { Pause the service: attention not supported by all services } ControlService(ServiceHandle, SERVICE_CONTROL_PAUSE, ServiceStatus); end;function TServiceManager.StopService: Boolean; var ServiceStatus: TServiceStatus; begin { Stop the service } Result := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, ServiceStatus); end;procedure TServiceManager.ContinueService; var ServiceStatus: TServiceStatus; begin { Continue the service after a pause: attention not supported by all services } ControlService(ServiceHandle, SERVICE_CONTROL_CONTINUE, ServiceStatus); end;procedure TServiceManager.ShutdownService; var ServiceStatus: TServiceStatus; begin { Shut service down: attention not supported by all services } ControlService(ServiceHandle, SERVICE_CONTROL_SHUTDOWN, ServiceStatus); end;function TServiceManager.StartService: Boolean; begin Result := DoStartService(0, ''); end;function TServiceManager.StartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean; begin Result := DoStartService(NumberOfArgument, ServiceArgVectors); end;function TServiceManager.GetStatus: DWORD; var ServiceStatus: TServiceStatus; begin { Returns the status of the service. Maybe you want to check this more than once, so just call this function again. Results may be: SERVICE_STOPPED SERVICE_START_PENDING SERVICE_STOP_PENDING SERVICE_RUNNING SERVICE_CONTINUE_PENDING SERVICE_PAUSE_PENDING SERVICE_PAUSED } QueryServiceStatus(ServiceHandle, ServiceStatus); Result := ServiceStatus.dwCurrentState; end;procedure TServiceManager.DisableService; begin { Implementation is following... } DeleteService(ServiceHandle); end;function TServiceManager.ServiceRunning: Boolean; begin Result := (GetStatus = SERVICE_RUNNING); end;function TServiceManager.ServiceStopped: Boolean; begin Result := (GetStatus = SERVICE_STOPPED); end;function TServiceManager.DoStartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean; begin Result := WinSvc.StartService(ServiceHandle, NumberOfArgument, ServiceArgVectors); end; function TServiceManager.GetStatusCn: string; begin case GetStatus of SERVICE_STOPPED: Result:='服务已停止'; //SERVICE_START_PENDING: Result:='正在启动服务'; //SERVICE_STOP_PENDING: Result:='正在停止服务'; SERVICE_RUNNING: Result:='服务正在运行'; //SERVICE_CONTINUE_PENDING: Result:='正在重起服务'; //SERVICE_PAUSE_PENDING: Result:='正在停止服务'; SERVICE_PAUSED: Result:='服务已暂停'; else Result:=( '状态未知' ); end; end;end.//ServiceName为exe的服务名 var FormServiceManger: TFormServiceManger; begin FServiceManager:=TServiceManager.Create; if Not FServiceManager.OpenServiceConnection(PAnsiChar(ServiceName)) then showmessage('当前服务状态:未安装服务') else FServiceManager.StopService; FServiceManager.Destroy; end;
SysUtils, Windows, WinSvc;type TServiceManager = class
private
{ Private declarations }
ServiceControlManager: SC_Handle;
ServiceHandle: SC_Handle;
protected
function DoStartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;
public
{ Public declarations }
function Connect(MachineName: PChar = nil; DatabaseName: PChar = nil;
Access: DWORD = SC_MANAGER_ALL_ACCESS): Boolean; // Access may be SC_MANAGER_ALL_ACCESS
function OpenServiceConnection(ServiceName: PChar): Boolean;
function StartService: Boolean; overload; // Simple start
function StartService(NumberOfArgument: DWORD; ServiceArgVectors: PChar): Boolean;
overload; // More complex start
function StopService: Boolean;
procedure PauseService;
procedure ContinueService;
procedure ShutdownService;
procedure DisableService;
function GetStatus: DWORD;
function GetStatusCn: string;
function ServiceRunning: Boolean;
function ServiceStopped: Boolean;
end;implementation{ TServiceManager }function TServiceManager.Connect(MachineName, DatabaseName: PChar;
Access: DWORD): Boolean;
begin
{ open a connection to the windows service manager }
ServiceControlManager := OpenSCManager(MachineName, DatabaseName, Access);
Result := (ServiceControlManager <> 0);
end;
function TServiceManager.OpenServiceConnection(ServiceName: PChar): Boolean;
begin
{ open a connetcion to a specific service }
ServiceHandle := OpenService(ServiceControlManager, ServiceName, SERVICE_ALL_ACCESS);
Result := (ServiceHandle <> 0);
end;procedure TServiceManager.PauseService;
var
ServiceStatus: TServiceStatus;
begin
{ Pause the service: attention not supported by all services }
ControlService(ServiceHandle, SERVICE_CONTROL_PAUSE, ServiceStatus);
end;function TServiceManager.StopService: Boolean;
var
ServiceStatus: TServiceStatus;
begin
{ Stop the service }
Result := ControlService(ServiceHandle, SERVICE_CONTROL_STOP, ServiceStatus);
end;procedure TServiceManager.ContinueService;
var
ServiceStatus: TServiceStatus;
begin
{ Continue the service after a pause: attention not supported by all services }
ControlService(ServiceHandle, SERVICE_CONTROL_CONTINUE, ServiceStatus);
end;procedure TServiceManager.ShutdownService;
var
ServiceStatus: TServiceStatus;
begin
{ Shut service down: attention not supported by all services }
ControlService(ServiceHandle, SERVICE_CONTROL_SHUTDOWN, ServiceStatus);
end;function TServiceManager.StartService: Boolean;
begin
Result := DoStartService(0, '');
end;function TServiceManager.StartService(NumberOfArgument: DWORD;
ServiceArgVectors: PChar): Boolean;
begin
Result := DoStartService(NumberOfArgument, ServiceArgVectors);
end;function TServiceManager.GetStatus: DWORD;
var
ServiceStatus: TServiceStatus;
begin
{ Returns the status of the service. Maybe you want to check this
more than once, so just call this function again.
Results may be: SERVICE_STOPPED
SERVICE_START_PENDING
SERVICE_STOP_PENDING
SERVICE_RUNNING
SERVICE_CONTINUE_PENDING
SERVICE_PAUSE_PENDING
SERVICE_PAUSED }
QueryServiceStatus(ServiceHandle, ServiceStatus);
Result := ServiceStatus.dwCurrentState;
end;procedure TServiceManager.DisableService;
begin
{ Implementation is following... }
DeleteService(ServiceHandle);
end;function TServiceManager.ServiceRunning: Boolean;
begin
Result := (GetStatus = SERVICE_RUNNING);
end;function TServiceManager.ServiceStopped: Boolean;
begin
Result := (GetStatus = SERVICE_STOPPED);
end;function TServiceManager.DoStartService(NumberOfArgument: DWORD;
ServiceArgVectors: PChar): Boolean;
begin
Result := WinSvc.StartService(ServiceHandle, NumberOfArgument, ServiceArgVectors);
end;
function TServiceManager.GetStatusCn: string;
begin
case GetStatus of
SERVICE_STOPPED: Result:='服务已停止';
//SERVICE_START_PENDING: Result:='正在启动服务';
//SERVICE_STOP_PENDING: Result:='正在停止服务';
SERVICE_RUNNING: Result:='服务正在运行';
//SERVICE_CONTINUE_PENDING: Result:='正在重起服务';
//SERVICE_PAUSE_PENDING: Result:='正在停止服务';
SERVICE_PAUSED: Result:='服务已暂停';
else
Result:=( '状态未知' );
end;
end;end.//ServiceName为exe的服务名
var
FormServiceManger: TFormServiceManger;
begin
FServiceManager:=TServiceManager.Create;
if Not FServiceManager.OpenServiceConnection(PAnsiChar(ServiceName)) then
showmessage('当前服务状态:未安装服务')
else
FServiceManager.StopService;
FServiceManager.Destroy;
end;