Содержание материала

 

Здесь представлены две функции ServiceStart и ServiceStop, которые показывают, как пользоваться API функциями OpenSCManager, OpenService и т.д.:

Code:

function ServiceStart(aMachine, aServiceName : string ) : boolean;

// aMachine это UNC путь, либо локальный компьютер если пусто

var

h_manager,h_svc: SC_Handle;

svc_status: TServiceStatus;

Temp: PChar;

dwCheckPoint: DWord;

begin

svc_status.dwCurrentState := 1;

h_manager := OpenSCManager(PChar(aMachine), Nil,

                            SC_MANAGER_CONNECT);

if h_manager > 0 then

begin

   h_svc := OpenService(h_manager, PChar(aServiceName),

                        SERVICE_START or SERVICE_QUERY_STATUS);

   if h_svc > 0 then

   begin

     temp := nil;

     if (StartService(h_svc,0,temp)) then

       if (QueryServiceStatus(h_svc,svc_status)) then

       begin

         while (SERVICE_RUNNING <> svc_status.dwCurrentState) do

         begin

           dwCheckPoint := svc_status.dwCheckPoint;

 

           Sleep(svc_status.dwWaitHint);

 

           if (not QueryServiceStatus(h_svc,svc_status)) then

             break;

 

           if (svc_status.dwCheckPoint < dwCheckPoint) then

           begin

             // QueryServiceStatus не увеличивает dwCheckPoint

             break;

           end;

         end;

       end;

     CloseServiceHandle(h_svc);

   end;

   CloseServiceHandle(h_manager);

end;

Result := SERVICE_RUNNING = svc_status.dwCurrentState;

end;

 


 

Code:

function ServiceStop(aMachine,aServiceName : string ) : boolean;

// aMachine это UNC путь, либо локальный компьютер если пусто

var

h_manager,h_svc   : SC_Handle;

svc_status     : TServiceStatus;

dwCheckPoint : DWord;

begin

h_manager:=OpenSCManager(PChar(aMachine),nil,

                          SC_MANAGER_CONNECT);

if h_manager > 0 then

begin

   h_svc := OpenService(h_manager,PChar(aServiceName),

                        SERVICE_STOP or SERVICE_QUERY_STATUS);

 

   if h_svc > 0 then

   begin

     if(ControlService(h_svc,SERVICE_CONTROL_STOP,

                       svc_status))then

     begin

       if(QueryServiceStatus(h_svc,svc_status))then

       begin

         while(SERVICE_STOPPED <> svc_status.dwCurrentState)do

         begin

           dwCheckPoint := svc_status.dwCheckPoint;

           Sleep(svc_status.dwWaitHint);

 

           if(not QueryServiceStatus(h_svc,svc_status))then

           begin

             // couldn't check status

             break;

           end;

 

           if(svc_status.dwCheckPoint < dwCheckPoint)then

             break;

 

         end;

       end;

     end;

     CloseServiceHandle(h_svc);

   end;

   CloseServiceHandle(h_manager);

end;

 

Result := SERVICE_STOPPED = svc_status.dwCurrentState;

end;

 


Чтобы узнать состояние сервиса, используйте следующую функцию:

 

Code:

function ServiceGetStatus(sMachine, sService: string ): DWord;

var

h_manager,h_service: SC_Handle;

service_status     : TServiceStatus;

hStat : DWord;

begin

hStat := 1;

h_manager := OpenSCManager(PChar(sMachine) ,Nil,

                            SC_MANAGER_CONNECT);

 

if h_manager > 0 then

begin

   h_svc := OpenService(h_manager,PChar(sService),

                     SERVICE_QUERY_STATUS);

 

   if h_svc > 0 then

   begin

     if(QueryServiceStatus(h_svc, service_status)) then

       hStat := service_status.dwCurrentState;

 

     CloseServiceHandle(h_svc);

   end;

   CloseServiceHandle(h_manager);

end;

 

Result := hStat;

end;

 

 

Она возвращает одну из следующих констант:

 

SERVICE_STOPPED

SERVICE_RUNNING

SERVICE_PAUSED

SERVICE_START_PENDING

SERVICE_STOP_PENDING

SERVICE_CONTINUE_PENDING

или

SERVICE_PAUSE_PENDING

 

Всё что, что Вам нужно, это unit WinSvc !

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить