现在的位置: 首页 > 综合 > 正文

Delphi 下操作Windows 服务的代码

2018年04月07日 ⁄ 综合 ⁄ 共 3956字 ⁄ 字号 评论关闭

Delphi下操作Windows Servie需要调用API函数,主要封装在 SvcMgr 和 WinSvc单元中,最近写了一个通用库,希望对大家有所帮助

 

 

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;

 

 

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;

 

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;

 

 

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;

 

 

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;

抱歉!评论已关闭.