Como parar um serviço do Windows 2000/XP?

Delphi

26/10/2004

Oi Pessoal...

Estou fazendo um programa que precisa para um determinado serviço do windows, deletar uns arquivos e colocar o serviço novamente no AR.
A pergunta é: Como eu faço para tirar um serviço do AR e depois colocar novamente no AR?


Grato!!!
Rafael Paz Monteiro :D :) :(


Oxenteknot

Oxenteknot

Curtidas 0

Respostas

Tatuweb

Tatuweb

26/10/2004

Olá, para parar e iniciar um serviço você pode usar as funções abaixo. Antes de mais nada declara a unit [b:9c74451a64]WinSvc[/b:9c74451a64] nas sessão uses do form.
[b:9c74451a64][color=blue:9c74451a64]
:arrow: Inicia um serviço:[/color:9c74451a64][/b:9c74451a64]

function ServiceStart  (sMachine, sService: string): boolean;
var
  schm, schs: SC_Handle;
  ss: TServiceStatus;
  psTemp: PChar;
  dwChkP: DWord;
begin
  ss.dwCurrentState := -1;
  schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT);

  if (schm > 0) then
  begin
    schs := OpenService (schm, PChar(sService),
      SERVICE_START or SERVICE_QUERY_STATUS);

    if (schs > 0) then
    begin
      psTemp := nil;
      if (StartService (schs, 0, psTemp)) then
      begin
        if (QueryServiceStatus (schs, ss)) then
        begin
          while (SERVICE_RUNNING <> ss.dwCurrentState) do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep (ss.dwWaitHint);
            if (not QueryServiceStatus (schs, ss)) then Break;
            if (ss.dwCheckPoint < dwChkP) then Break;
          end;
        end;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_RUNNING = ss.dwCurrentState;
end;
[b:9c74451a64][color=blue:9c74451a64]
:arrow: Finaliza um serviço:[/color:9c74451a64][/b:9c74451a64]

function ServiceStop (sMachine, sService: string): boolean;
var
  schm, schs: SC_Handle;
  ss: TServiceStatus;
  dwChkP: DWord;
begin
  schm := OpenSCManager (PChar (sMachine), nil, SC_MANAGER_CONNECT);
  if (schm > 0) then
  begin
    schs := OpenService (schm, PChar (sService),
      SERVICE_STOP or SERVICE_QUERY_STATUS);

    if (schs > 0) then
    begin
      if (ControlService (schs, SERVICE_CONTROL_STOP, ss)) then
      begin
        if(QueryServiceStatus (schs, ss)) then
        begin
          while (SERVICE_STOPPED <> ss.dwCurrentState) do
          begin
            dwChkP := ss.dwCheckPoint;
            Sleep (ss.dwWaitHint);
            if (not QueryServiceStatus (schs, ss)) then Break;
            if (ss.dwCheckPoint < dwChkP)then Break;
          end;
        end;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result := SERVICE_STOPPED = ss.dwCurrentState;
end;

Para chamar as funções siga os exemplos abaixo. É importante notar que se for um serviço do Windows você tem que chamá-lo pelo nome que se encontra na versão em inglês do Windows. No exemplo abaixo o serviço Mensageiro é ´messenger´.

:arrow: [b:9c74451a64]Inicia o serviço mensageiro na máquina local (127.0.0.1)
[/b:9c74451a64]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;
  if not ServiceStart (´127.0.0.1´, ´messenger´) then
  begin
    Screen.Cursor := crDefault;
    ShowMessage (´O Serviço não pode ser iniciado!´);
  end;
  Screen.Cursor := crDefault;
end;

:arrow: [b:9c74451a64]Interrompe o serviço mensageiro na máquina local (127.0.0.1)
[/b:9c74451a64]
procedure TForm1.Button2Click(Sender: TObject);
begin
  Screen.Cursor := crHourGlass;
  if not ServiceStop (´127.0.0.1´, ´messenger´) then
  begin
    Screen.Cursor := crDefault;
    ShowMessage (´O Serviço não pode ser finalizado!´);
  end;
  Screen.Cursor := crDefault;
end;



GOSTEI 0
Oxenteknot

Oxenteknot

26/10/2004

Cara,

Muito Obrigado!!!!

Rafael Paz Monteiro


GOSTEI 0
Paullsoftware

Paullsoftware

26/10/2004

ai fui testar as funções acima e ta dando erro na linha...
schm, schs: [b:5a64fb8451]SC_Handle[/b:5a64fb8451];

qual o unit tenho que declarar???


GOSTEI 0
Paullsoftware

Paullsoftware

26/10/2004

ai fui testar as funções acima e ta dando erro na linha... schm, schs: [b:1e4eb6ad06]SC_Handle[/b:1e4eb6ad06]; qual o unit tenho que declarar???


encontrei tenho q declarar [b:1e4eb6ad06]uses winsvc;[/b:1e4eb6ad06]


GOSTEI 0
POSTAR