首页  编辑  

判断一个服务是否已经运行

Tags: /超级猛料/Core.驱动,VxD,服务/   Date Created:

check if a service is running?

uses

 WinSvc;

function ServiceGetStatus(sMachine, sService: PChar): DWORD;

 {******************************************}

 {*** Parameters: ***}

 {*** sService: specifies the name of the service to open

 {*** sMachine: specifies the name of the target computer

 {*** ***}

 {*** Return Values: ***}

 {*** -1 = Error opening service ***}

 {*** 1 = SERVICE_STOPPED ***}

 {*** 2 = SERVICE_START_PENDING ***}

 {*** 3 = SERVICE_STOP_PENDING ***}

 {*** 4 = SERVICE_RUNNING ***}

 {*** 5 = SERVICE_CONTINUE_PENDING ***}

 {*** 6 = SERVICE_PAUSE_PENDING ***}

 {*** 7 = SERVICE_PAUSED ***}

 {******************************************}

var

 SCManHandle, SvcHandle: SC_Handle;

 SS: TServiceStatus;

 dwStat: DWORD;

begin

 dwStat := 0;

 // Open service manager handle.

 SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT);

 if (SCManHandle > 0) then

 begin

   SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS);

   // if Service installed

   if (SvcHandle > 0) then

   begin

     // SS structure holds the service status (TServiceStatus);

     if (QueryServiceStatus(SvcHandle, SS)) then

       dwStat := ss.dwCurrentState;

     CloseServiceHandle(SvcHandle);

   end;

   CloseServiceHandle(SCManHandle);

 end;

 Result := dwStat;

end;

function ServiceRunning(sMachine, sService: PChar): Boolean;

begin

 Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService);

end;

// Check if Eventlog Service is running

procedure TForm1.Button1Click(Sender: TObject);

begin

 if ServiceRunning(nil, 'Eventlog') then

   ShowMessage('Eventlog Service Running')

 else

   ShowMessage('Eventlog Service not Running')

end;

{

 Windows 2000 and earlier: All processes are granted the SC_MANAGER_CONNECT,

 SC_MANAGER_ENUMERATE_SERVICE, and SC_MANAGER_QUERY_LOCK_STATUS access rights.

 Windows XP: Only authenticated users are granted the SC_MANAGER_CONNECT,

 SC_MANAGER_ENUMERATE_SERVICE,

 and SC_MANAGER_QUERY_LOCK_STATUS access rights.

}

{

 Do not use the service display name (as displayed in the services

 control panel applet.) You must use the real service name, as

 referenced in the registry under

 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services

}