Looking for a way to check the status of Windows services? "QueryServiceStatus()" Win32 function can do this for you, but you have to setup a few things beforehand using "OpenSCManager()" and "OpenService()" functions as demonstrated below.
uses WinSvc;
//-------------------------------------
// get service status
//
// return status code if successful
// -1 if not
//
// return codes:
// SERVICE_STOPPED
// SERVICE_RUNNING
// SERVICE_PAUSED
//
// following return codes
// are used to indicate that
// the service is in the
// middle of getting to one
// of the above states:
// SERVICE_START_PENDING
// SERVICE_STOP_PENDING
// SERVICE_CONTINUE_PENDING
// SERVICE_PAUSE_PENDING
//
// sMachine:
// machine name, ie: \SERVER
// empty = local machine
//
// sService
// service name, ie: Alerter
//
function ServiceGetStatus(
sMachine,
sService : string ) : DWord;
var
//
// service control
// manager handle
schm,
//
// service handle
schs : SC_Handle;
//
// service status
ss : TServiceStatus;
//
// current service status
dwStat : DWord;
begin
dwStat := -1;
// connect to the service
// control manager
schm := OpenSCManager(
PChar(sMachine),
Nil,
SC_MANAGER_CONNECT);
// if successful...
if(schm > 0)then
begin
// open a handle to
// the specified service
schs := OpenService(
schm,
PChar(sService),
// we want to
// query service status
SERVICE_QUERY_STATUS);
// if successful...
if(schs > 0)then
begin
// retrieve the current status
// of the specified service
if(QueryServiceStatus(
schs,
ss))then
begin
dwStat := ss.dwCurrentState;
end;
// close service handle
CloseServiceHandle(schs);
end;
// close service control
// manager handle
CloseServiceHandle(schm);
end;
Result := dwStat;
end;
Now that we have a basic function -- "ServiceGetStatus()" -- to get the status of a specified service running on a specified machine, let's simplify the process even more with the following "ServiceRunning()" and "ServiceStopped()" functions.
//-------------------------------------
// return TRUE if the specified
// service is running, defined by
// the status code SERVICE_RUNNING.
// return FALSE if the service
// is in any other state, including
// any pending states
//
function ServiceRunning(
sMachine,
sService : string ) : boolean;
begin
Result := SERVICE_RUNNING =
ServiceGetStatus(
sMachine, sService );
end;
//-------------------------------------
// return TRUE if the specified
// service was stopped, defined by
// the status code SERVICE_STOPPED.
//
function ServiceStopped(
sMachine,
sService : string ) : boolean;
begin
Result := SERVICE_STOPPED =
ServiceGetStatus(
sMachine, sService );
end;
Both "ServiceRunning()" and "ServiceStopped()" functions expect a standard machine name and a service name. The machine name can be empty if you're checking a service running on the local machine. For example:
if( ServiceRunning(
'\ComputerName',
'alerter' ) )then
begin
// "alerter" service on \ComputerName
// is running
// take appropriate action here
end;
if( ServiceRunning(
'',
'alerter' ) )then
begin
// "alerter" service on the
// local computer is running
end;
if( ServiceStopped(
'',
'alerter' ) )then
begin
// "alerter" service on the
// local computer is in the
// "stopped" state (not running)
end;