Delphi下操作Windows Servie需要调用API函数,主要封装在 SvcMgr 和 WinSvc单元中,最近写了一个通用库,希望对大家有所帮助
Function ServiceIsRunning()function ServiceIsRunning(ServiceName: string): Boolean;
var
SCManager: THandle;
HService: THandle;
ServiceStatus: TServiceStatus;
begin
Result := false;
if HInst = 0 then
Exit;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), GENERIC_READ);
if HService <> 0 then
begin
if ControlService(HService, SERVICE_CONTROL_INTERROGATE, ServiceStatus) then
begin
// If QueryServiceStatus(hService, ServiceStatus) Then Begin
if ServiceStatus.dwCurrentState = SERVICE_RUNNING then
begin
Result := true;
end;
end;
CloseServiceHandle(HService);
end;
CloseServiceHandle(SCManager);
end;
end;
var
SCManager: THandle;
HService: THandle;
ServiceStatus: TServiceStatus;
begin
Result := false;
if HInst = 0 then
Exit;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), GENERIC_READ);
if HService <> 0 then
begin
if ControlService(HService, SERVICE_CONTROL_INTERROGATE, ServiceStatus) then
begin
// If QueryServiceStatus(hService, ServiceStatus) Then Begin
if ServiceStatus.dwCurrentState = SERVICE_RUNNING then
begin
Result := true;
end;
end;
CloseServiceHandle(HService);
end;
CloseServiceHandle(SCManager);
end;
end;
Function StopService()function StopService(ServiceName: string): Boolean;
var
SCManager: THandle;
HService: THandle;
ServiceStatus: TServiceStatus;
begin
Result := false;
if HInst = 0 then
Exit;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), SERVICE_ALL_ACCESS);
if HService <> 0 then
begin
if QueryServiceStatus(hService, ServiceStatus) then
begin
if ServiceStatus.dwCurrentState = SERVICE_RUNNING then
begin
Result := ControlService(hService, SERVICE_CONTROL_STOP, ServiceStatus);
end;
end;
CloseServiceHandle(HService);
end;
CloseServiceHandle(SCManager);
end;
end;
var
SCManager: THandle;
HService: THandle;
ServiceStatus: TServiceStatus;
begin
Result := false;
if HInst = 0 then
Exit;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), SERVICE_ALL_ACCESS);
if HService <> 0 then
begin
if QueryServiceStatus(hService, ServiceStatus) then
begin
if ServiceStatus.dwCurrentState = SERVICE_RUNNING then
begin
Result := ControlService(hService, SERVICE_CONTROL_STOP, ServiceStatus);
end;
end;
CloseServiceHandle(HService);
end;
CloseServiceHandle(SCManager);
end;
end;
Function ServiceIsInstalled()function ServiceIsInstalled(ServiceName: string): Boolean;
var
SCManager: THandle;
HService: THandle;
begin
Result := false;
if HInst = 0 then
Exit;
if Assigned(OpenSCManager) and Assigned(OpenService) and
Assigned(CloseServiceHandle) then
begin
SCManager := OpenSCManager(nil, nil, GENERIC_READ);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), GENERIC_READ);
Result := HService <> 0;
if HService <> 0 then
begin
CloseServiceHandle(HService);
end;
CloseServiceHandle(SCManager);
end;
end;
end;
var
SCManager: THandle;
HService: THandle;
begin
Result := false;
if HInst = 0 then
Exit;
if Assigned(OpenSCManager) and Assigned(OpenService) and
Assigned(CloseServiceHandle) then
begin
SCManager := OpenSCManager(nil, nil, GENERIC_READ);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), GENERIC_READ);
Result := HService <> 0;
if HService <> 0 then
begin
CloseServiceHandle(HService);
end;
CloseServiceHandle(SCManager);
end;
end;
end;
Function StartService()function StartService(ServiceName: string): Boolean;
var
SCManager: THandle;
HService: THandle;
ServiceStatus: TServiceStatus;
Parms: PChar;
begin
Result := false;
if HInst = 0 then
Exit;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), SERVICE_ALL_ACCESS);
if HService <> 0 then
begin
if QueryServiceStatus(hService, ServiceStatus) then
begin
if ServiceStatus.dwCurrentState = SERVICE_STOPPED then
begin
Parms := nil;
Result := DoStartService(hService, 0, Parms);
end;
end;
CloseServiceHandle(HService);
end;
CloseServiceHandle(SCManager);
end;
end;
var
SCManager: THandle;
HService: THandle;
ServiceStatus: TServiceStatus;
Parms: PChar;
begin
Result := false;
if HInst = 0 then
Exit;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), SERVICE_ALL_ACCESS);
if HService <> 0 then
begin
if QueryServiceStatus(hService, ServiceStatus) then
begin
if ServiceStatus.dwCurrentState = SERVICE_STOPPED then
begin
Parms := nil;
Result := DoStartService(hService, 0, Parms);
end;
end;
CloseServiceHandle(HService);
end;
CloseServiceHandle(SCManager);
end;
end;
Function ChangeServiceConfig()function ChangeServiceConfig(ServiceName: string; StartType: Integer): Boolean;
var
SCManager, HService: THandle;
PConfig: PQueryServiceConfigA;
Buf: DWORD;
begin
Result := False;
if HInst = 0 then Exit;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), SERVICE_ALL_ACCESS);
if HService <> 0 then
begin
New(PConfig);
QueryServiceConfigA(HService, PConfig, SizeOf(_QUERY_SERVICE_CONFIGA), Buf);
ChangeServiceConfigA(HService, PConfig.dwServiceType,
StartType, PConfig.dwErrorControl, PConfig.lpBinaryPathName,
PConfig.lpLoadOrderGroup, 0, PConfig.lpDependencies,
PConfig.lpServiceStartName, '', PConfig.lpDisplayName);
CloseServiceHandle(HService);
DisPose(PConfig);
Result := True;
end
else
Result := False;
CloseServiceHandle(SCManager);
end
else
Result := False;
end;
var
SCManager, HService: THandle;
PConfig: PQueryServiceConfigA;
Buf: DWORD;
begin
Result := False;
if HInst = 0 then Exit;
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager <> 0 then
begin
HService := OpenService(SCManager, PChar(ServiceName), SERVICE_ALL_ACCESS);
if HService <> 0 then
begin
New(PConfig);
QueryServiceConfigA(HService, PConfig, SizeOf(_QUERY_SERVICE_CONFIGA), Buf);
ChangeServiceConfigA(HService, PConfig.dwServiceType,
StartType, PConfig.dwErrorControl, PConfig.lpBinaryPathName,
PConfig.lpLoadOrderGroup, 0, PConfig.lpDependencies,
PConfig.lpServiceStartName, '', PConfig.lpDisplayName);
CloseServiceHandle(HService);
DisPose(PConfig);
Result := True;
end
else
Result := False;
CloseServiceHandle(SCManager);
end
else
Result := False;
end;