ServiceManager
From Lazarus wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
For Windows, the fcl-extra package contains a unit called ServiceManager.
Example that checks whether the SamSs (Security Accounts Manager; should always be running) service is running is below. (Command line equivalent sc query samss) Note: I could only get this running using an elevated command prompt on Vista, which shouldn't be necessary.
--BigChimp 10:27, 10 June 2011 (CEST)
program ServiceTest; // Check if a certain process is running.
{$mode objfpc}{$H+}
uses
Classes, SysUtils, ServiceManager, JwaWinSvc {for services declarations};
function IsServiceRunning(ServiceName: string): boolean; {description Checks if a Windows service is running} var Services: TServiceManager; ServiceStatus: TServiceStatus; begin //Check for existing services //equivalent to sc query <servicename> Services := TServiceManager.Create(nil); try try Services.Connect; Services.Acces := SC_MANAGER_CONNECT; //Note typo in property. //We don't need more access permissions than this; by default //the servicemanager is trying to get all access Services.GetServiceStatus(ServiceName, ServiceStatus); if ServiceStatus.dwCurrentState = SERVICE_RUNNING then begin Result := True; end else begin Result := False; end; Services.Disconnect; except on E: EServiceManager do begin // A missing service might throw a missing handle exception? No? {LogOutput('Error getting service information for ' + ServiceName + '. Technical details: ' + E.ClassName + '/' + E.Message);} Result := False; raise; //rethrow original exception end; on E: Exception do begin {LogOutput('Error getting service information for ' + ServiceName + '. Technical details: ' + E.ClassName + '/' + E.Message); } Result := False; raise; //rethrow original exception end; end; finally Services.Free; end; end;
const
ServiceToTest = 'SamSs'; //Security Accounts Manager, should be running, at least on Vista
begin
WriteLn('Starting test for ' + ServiceToTest + ' service.'); if IsServiceRunning(ServiceToTest) then begin WriteLn('The ' + ServiceToTest + ' service is running'); end else begin WriteLn('The ' + ServiceToTest + ' service is not running'); end;
end.