function ServiceStart(Machine, ServiceName:
string): Boolean;
// Machine is UNC path or local machine if empty
var
h_manager, h_svc: SC_Handle;
ServiceStatus: TServiceStatus;
dwCheckPoint: DWORD;
ServiceArgVectors: PChar;
begin
h_manager := OpenSCManager(PChar(Machine),
nil, SC_MANAGER_CONNECT);
if h_manager > 0
then
begin
h_svc := OpenService(h_manager, PChar(ServiceName),
SERVICE_START
or SERVICE_QUERY_STATUS
or SC_MANAGER_ALL_ACCESS);
if h_svc > 0
then
begin
if (StartService(h_svc, 0, ServiceArgVectors))
then { succeeded }
begin
if (QueryServiceStatus(h_svc, ServiceStatus))
then
begin
while (SERVICE_RUNNING <> ServiceStatus.dwCurrentState)
do
begin
dwCheckPoint := ServiceStatus.dwCheckPoint;
Sleep(ServiceStatus.dwWaitHint);
if (
not QueryServiceStatus(h_svc, ServiceStatus))
then
// couldn't check status
break;
if (ServiceStatus.dwCheckPoint < dwCheckPoint)
then
break;
end;
end;
end;
CloseServiceHandle(h_svc);
end;
CloseServiceHandle(h_manager);
end;
Result := (SERVICE_RUNNING = ServiceStatus.dwCurrentState);
end;