//得到服务的状态
function GetSampleServiceStatus(const ServiceName: PAnsiChar; var
lpServiceStatus:
TServiceStatus): LongBool;
implementation
uses Variants;
function StartSampleService(const ServiceName: PAnsiChar): LongBool;
var
schSCManager, schService: SC_HANDLE;
ssStatus: TServiceStatus;
dwOldCheckPoint, dwStartTickCount, dwWaitTime: DWORD;
lpServiceArgVectors: Pchar;
begin
Result := False;
schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if schSCManager = 0 then
Exit;
schService := OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
if schService = 0 then
Exit;
try
lpServiceArgVectors := nil;
if not StartService(schService, 0, lpServiceArgVectors) then
Exit;
if not QueryServiceStatus(schService, ssStatus) then
Exit;
while ssStatus.dwCurrentState = SERVICE_START_PENDING do
begin
dwWaitTime := ssStatus.dwWaitHint div 10;
if dwWaitTime < 1000 then
dwWaitTime := 1000
else if dwWaitTime > 10000 then
dwWaitTime := 10000;
Sleep(dwWaitTime);
if not QueryServiceStatus(schService, ssStatus) then
Break;
if ssStatus.dwCheckPoint > dwOldCheckPoint then
begin
dwStartTickCount := GetTickCount;
dwOldCheckPoint := ssStatus.dwCheckPoint;
end
else if GetTickCount - dwStartTickCount > ssStatus.dwWaitHint then
Break;
end;
if ssStatus.dwCurrentState = SERVICE_RUNNING then
Result := True;
finally
CloseServiceHandle(schService);
end;
end;
function StopSampleService(const ServiceName: PAnsiChar;
const fStopDependencies: LongBool; const dwTimeout: DWORD): LongBool;
var
schSCManager, schService, hDepService: SC_HANDLE;
ssStatus: TServiceStatus;
dwStartTime: DWORD;
I, dwBytesNeeded, dwCount: DWORD;
lpDependencies: PEnumServiceStatus;
ess: TEnumServiceStatus;
begin
Result := False;
dwStartTime := GetTickCount;
schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ENUMERATE_SERVICE);
if schSCManager = 0 then
Exit;
schService := OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
if schService = 0 then
Exit;
if not QueryServiceStatus(schService, ssStatus) then
Exit;
if ssStatus.dwCurrentState = SERVICE_STOPPED then
begin
Result := True;
Exit;
end;
while ssStatus.dwCurrentState = SERVICE_STOP_PENDING do
begin
Sleep(ssStatus.dwWaitHint);
if not QueryServiceStatus(schService, ssStatus) then
Exit;
if ssStatus.dwCurrentState = SERVICE_STOPPED then
begin
Result := True;
Exit;
end;
if (GetTickCount - dwStartTime > dwTimeout) then
Exit;
end;
if fStopDependencies then
begin
lpDependencies := nil;
if EnumDependentServices(schService, SERVICE_ACTIVE, lpDependencies^, 0,
dwBytesNeeded, dwCount) then
begin
end
else
begin
if GetLastError <> ERROR_MORE_DATA then
Exit;
try
if not EnumDependentServices(schService, SERVICE_ACTIVE,
lpDependencies^,
dwBytesNeeded, dwBytesNeeded, dwCount) then
Exit;
for I := 0 to dwCount - 1 do
begin
ess := lpDependencies^;
hDepService := OpenService(schSCManager, ess.lpServiceName,
SERVICE_STOP or
SERVICE_QUERY_STATUS);
if hDepService = 0 then
Exit;
try
if not ControlService(hDepService, SERVICE_CONTROL_STOP, ssStatus)
then
Exit;
while ssStatus.dwCurrentState <> SERVICE_STOPPED do
begin
Sleep(ssStatus.dwWaitHint);
if not QueryServiceStatus(hDepService, ssStatus) then
Exit;
if ssStatus.dwCurrentState = SERVICE_STOPPED then
begin
Inc(lpDependencies);
Break;
end;
if not ControlService(schService, SERVICE_CONTROL_STOP, ssStatus) then
Exit;
while ssStatus.dwCurrentState <> SERVICE_STOPPED do
begin
Sleep(ssStatus.dwWaitHint);
if not QueryServiceStatus(schService, ssStatus) then
Exit;
if ssStatus.dwCurrentState = SERVICE_STOPPED then
Break;
if GetTickCount - dwStartTime > dwTimeout then
Exit;
end;
Result := True;
end;
function GetSampleServiceStatus(const ServiceName: PAnsiChar; var
lpServiceStatus:
TServiceStatus): LongBool;
var
schSCManager, schService: SC_HANDLE;
begin
Result := False;
schSCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if schSCManager = 0 then
Exit;
schService := OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);
if schService = 0 then
Exit;
try
if not QueryServiceStatus(schService, lpServiceStatus) then
Exit;
Result := True;
finally
CloseServiceHandle(schService);
end;
end;