Ir al contenido


Foto

Iniciar y Detener servicios de Windows


  • Por favor identifícate para responder
No hay respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 23 agosto 2010 - 12:06

Pues eso, les paso dos funciones mejoradas que había encontrado en la red hace algún tiempo que nos servirá para detener e iniciar cualquier servicio de Windows, os los dejo y que los disfruten  (h)

Iniciar Windows



delphi
  1. uses WinSvc;
  2.  
  3. function IniciarServicio(Maquina,Servicio : string ) : boolean;
  4. var
  5.   schm,
  6.   schs  : SC_Handle;
  7.   ss    : TServiceStatus;
  8.   psTemp : PChar;
  9.   dwChkP : DWord;
  10. begin
  11.   ss.dwCurrentState := -1;
  12.  
  13.   schm := OpenSCManager(PChar(Maquina),Nil,SC_MANAGER_CONNECT);
  14.  
  15.   if (schm > 0) then
  16.   begin
  17.     schs := OpenService(schm,PChar(Servicio),SERVICE_START or SERVICE_QUERY_STATUS);
  18.  
  19.     if (schs > 0) then
  20.     begin
  21.       psTemp := Nil;
  22.       if StartService(schs,0,psTemp) then
  23.       begin
  24.         if QueryServiceStatus(schs,ss) then
  25.         begin
  26.           while (SERVICE_RUNNING <> ss.dwCurrentState) do
  27.           begin
  28.             dwChkP := ss.dwCheckPoint;
  29.             Sleep(ss.dwWaitHint);
  30.  
  31.             if not QueryServiceStatus(schs,ss) then
  32.             begin
  33.               break;
  34.             end;
  35.  
  36.             if (ss.dwCheckPoint < dwChkP) then
  37.             begin
  38.               break;
  39.             end;
  40.           end;
  41.         end;
  42.       end;
  43.  
  44.       CloseServiceHandle(schs);
  45.     end;
  46.  
  47.     CloseServiceHandle(schm);
  48.   end;
  49.  
  50.   Result := SERVICE_RUNNING = ss.dwCurrentState;
  51. end;



Detener Servicio



delphi
  1. function DetenerServicio(Maquina,Servicio : string ) : boolean;
  2. var
  3.   schm,
  4.   schs  : SC_Handle;
  5.   ss    : TServiceStatus;
  6.   dwChkP : DWord;
  7. begin
  8.   schm := OpenSCManager(PChar(Maquina),Nil,SC_MANAGER_CONNECT);
  9.  
  10.   if (schm > 0) then
  11.   begin
  12.     schs := OpenService(schm,PChar(Servicio),SERVICE_STOP or SERVICE_QUERY_STATUS);
  13.  
  14.     if (schs > 0) then
  15.     begin
  16.       if (ControlService(schs,SERVICE_CONTROL_STOP,ss)) then
  17.       begin
  18.         if (QueryServiceStatus(schs,ss)) then
  19.         begin
  20.           while (SERVICE_STOPPED <> ss.dwCurrentState) do
  21.           begin
  22.             dwChkP := ss.dwCheckPoint;
  23.             Sleep(ss.dwWaitHint);
  24.  
  25.             if (not QueryServiceStatus(schs,ss)) then
  26.             begin
  27.               break;
  28.             end;
  29.  
  30.             if (ss.dwCheckPoint < dwChkP) then
  31.             begin
  32.               break;
  33.             end;
  34.           end;
  35.         end;
  36.       end;
  37.  
  38.       CloseServiceHandle(schs);
  39.     end;
  40.  
  41.     CloseServiceHandle(schm);
  42.   end;
  43.  
  44.   Result := SERVICE_STOPPED = ss.dwCurrentState;
  45. end;



Probado en XP, aún no lo he probado en Vista y/o Win7, si alguien puede que me lo confirme.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.