API - controlando servicos do Windows NT |
Top Previous Next |
unit SvcUtils;
// Written by Bertrand Goetzmann (http://www.object-everywhere.com) // Keywords : Service, OpenSCManager, OpenService, CloseServiceHandle, QueryServiceConfig, StartService, QueryServiceStatus, ControlService
interface
// This function returns the entire path location of the implementation of the given name service function GetBinaryPathName(const ServiceName: string): string;
// This function starts the service with the given service name procedure StartService(const ServiceName: string);
// This function stops the service with the given service name procedure StopService(const ServiceName: string);
implementation
uses SysUtils, WinSvc;
function GetBinaryPathName(const ServiceName: string): string; var SvcMgr, Svc: Integer; QuerySvc: TQueryServiceConfig; BytesNeeded: Cardinal;
Buffer: PQueryServiceConfig; begin // Establish a connection to the service control manager SvcMgr := OpenSCManager(nil (*MachineName*), nil (*DatabaseName*), SC_MANAGER_ALL_ACCESS); try if SvcMgr = 0 then RaiseLastOSError;
Svc := OpenService(SvcMgr, PChar(ServiceName), SERVICE_ALL_ACCESS); if Svc = 0 then RaiseLastOSError; try // Make a call to know the number of bytes needed QueryServiceConfig(Svc, @QuerySvc, 0, BytesNeeded);
GetMem(Buffer, BytesNeeded); try if not QueryServiceConfig(Svc, Buffer, BytesNeeded, BytesNeeded) then RaiseLastOSError;
Result := PQueryServiceConfig(Buffer).lpBinaryPathName; finally FreeMem(Buffer); end; finally CloseServiceHandle(Svc); end; finally CloseServiceHandle(SvcMgr); end; end;
procedure StartService(const ServiceName: string); var SvcMgr, Svc: Integer; ServiceArgVectors: PChar; begin // Establish a connection to the service control manager SvcMgr := OpenSCManager(nil (*MachineName*), nil (*DatabaseName*), SC_MANAGER_ALL_ACCESS); try if SvcMgr = 0 then RaiseLastOSError;
Svc := OpenService(SvcMgr, PChar(ServiceName), SERVICE_ALL_ACCESS); if Svc = 0 then RaiseLastOSError; try if not WinSvc.StartService(Svc, 0 (*NumServiceArgs*), ServiceArgVectors) then RaiseLastOSError; finally CloseServiceHandle(Svc); end; finally CloseServiceHandle(SvcMgr); end; end;
procedure StopService(const ServiceName: string); var SvcMgr, Svc: Integer; ServiceStatus: _SERVICE_STATUS; begin // Establish a connection to the service control manager SvcMgr := OpenSCManager(nil (*MachineName*), nil (*DatabaseName*), SC_MANAGER_ALL_ACCESS); try if SvcMgr = 0 then RaiseLastOSError;
Svc := OpenService(SvcMgr, PChar(ServiceName), SERVICE_ALL_ACCESS); if Svc = 0 then RaiseLastOSError; try // if not QueryServiceStatus(Svc, ServiceStatus) then // RaiseLastOSError; // You can test the ServiceStatus.dwCurrentState field
if not ControlService(Svc, SERVICE_CONTROL_STOP, ServiceStatus) then RaiseLastOSError; finally CloseServiceHandle(Svc); end; finally CloseServiceHandle(SvcMgr); end; end;
end. |