// start service
//
// return TRUE if successful
//
// sMachine:
// machine name, ie: \\SERVER
// empty = local machine
//
// sService
// service name, ie: spooler
//
function TPPInstallForm.ServiceStart(sMachine, sService :
string ) : boolean;
var
schm, schs : SC_Handle;
// service control manager handle & service handle
ss : TServiceStatus;
// service status
psTemp : PChar;
// temp char pointer
dwChkP : DWord;
// check point
begin
ss.dwCurrentState := 0;
// 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
// we want to start the service and query service status
schs := OpenService(schm, PChar(sService), SERVICE_START
or SERVICE_QUERY_STATUS);
// if successful...
if(schs > 0)
then begin
psTemp :=
Nil;
if(StartService(schs, 0, psTemp))
then begin
// check status
if (QueryServiceStatus(schs, ss))
then begin
while (SERVICE_RUNNING <> ss.dwCurrentState)
do begin
//
// dwCheckPoint contains a value that the service increments periodically
// to report its progress during a lengthy operation.
// save current value
dwChkP := ss.dwCheckPoint;
// wait a bit before checking status again
//
// dwWaitHint is the estimated amount of time
// the calling program should wait before calling
// QueryServiceStatus() again
//
// idle events should be
// handled here...
//
Sleep(ss.dwWaitHint);
if (
not QueryServiceStatus(schs, ss))
then begin
// couldn't check status
// break from the loop
break;
end;
if (ss.dwCheckPoint < dwChkP)
then begin
// QueryServiceStatus didn't increment dwCheckPoint as it should have.
// avoid an infinite loop by breaking
break;
end;
end;
end;
end;
// close service handle
CloseServiceHandle(schs);
end;
// close service control manager handle
CloseServiceHandle(schm);
end;
// return TRUE if the service status is running
Result := SERVICE_RUNNING = ss.dwCurrentState;
end;
//------------------------------------------------------------------------------
// stop service
//
// return TRUE if successful
//
// sMachine:
// machine name, ie: \\SERVER
// empty = local machine
//
// sService
// service name, ie: Alerter
//
function TPPInstallForm.ServiceStop(sMachine, sService :
string ) : boolean;
var
schm, schs : SC_Handle;
// service control & service handle manager handle
ss : TServiceStatus;
// service status
dwChkP : DWord;
// check point
begin
// 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
// we want to stop the service and query service status
schs := OpenService(schm, PChar(sService), SERVICE_STOP
or SERVICE_QUERY_STATUS);
// if successful...
if (schs > 0)
then begin
if (ControlService(schs, SERVICE_CONTROL_STOP, ss))
then begin
// check status
if (QueryServiceStatus(schs, ss))
then begin
while (SERVICE_STOPPED <> ss.dwCurrentState)
do begin
// dwCheckPoint contains a value that the service increments periodically
// to report its progress during a lengthy operation.
// save current value
dwChkP := ss.dwCheckPoint;
// wait a bit before checking status again
// dwWaitHint is the estimated amount of time
// the calling program should wait before calling QueryServiceStatus() again
// idle events should be handled here...
Sleep(ss.dwWaitHint);
if (
not QueryServiceStatus(schs, ss))
then begin
// couldn't check status
// break from the loop
break;
end;
if (ss.dwCheckPoint < dwChkP)
then begin
// QueryServiceStatus didn't increment dwCheckPoint as it should have.
// avoid an infinite loop by breaking
break;
end;
end;
end;
end;
// close service handle
CloseServiceHandle(schs);
end;
// close service control manager handle
CloseServiceHandle(schm);
end;
// return TRUE if the service status is stopped
Result := SERVICE_STOPPED = ss.dwCurrentState;
end;