Como criar um Application Service?

Delphi

07/07/2009

Boa tarde.

Estou precisando criar um Serviço do Windows com o Delphi 7

Quero mostrar uma janela, nesta janela tem dois botões, um para terminar e desinstalar o serviço (de dentro do serviço), o outro botão ativa um TTimer e pausa o serviço, O Timer de 20 segundos ativa novamente o serviço que estava pausado.
Por gentileza, não indique links para tutoriais, já pesquisei na internet, a maioria que encontrei estavam em inglês e eu não entendo nada de inglês, já os tuto em português nãi mostra o que quero fazer, se você sabe como fazer eu peço humildemente que coloque aqui mesmo como eu devo fazer. Para criar o serviço eu sei, o que não sei é como proceder com o que eu citei no início desta mensagem.

Sei que tenho de usar o onExecute e o onStart mas não sei como alojar nestes dois evento para funcionar como eu quero. Acrescentei um form ao projeto e nele os dois botões, na saída deste form eu pego o ModalResult mrOk para ativar o Timer que está no DataModule do serviço e o mrNo que vai terminar o serviço e desinsta-lo definitivamente.

Aguardo um ajuda dos mestres que já trabalharam ou trabalha com Serviço do Windows.


Onjahyr

Onjahyr

Curtidas 0

Respostas

Woinch

Woinch

07/07/2009

Deixa eu ver se eu entendi, você quer parar ou reiniciar o serviço dentro dele mesmo? É isso?
Ou você teria uma aplicação terceira que controlaria esse serviço?


GOSTEI 0
Onjahyr

Onjahyr

07/07/2009

Oi Woinch, tudo bom?

Eu mudei o processo, não tava conseguindo, uma semana tentando, então passei a ter um segundo aplicativo. agora o serviço executa este aplicativo, o aplicativo faz:

- btn1 -> dá um pause no serviço e habilita um Timer, este timer qdo chegar o tempo recomeça o serviço novamente de onde parou;

- btn2 -> termina o serviço;

- btn3 -> termina e desinsta o serviço para sempre.

Pode me ajudar como faço isso?

agradeço a ajuda!


GOSTEI 0
Onjahyr

Onjahyr

07/07/2009

:oops:

up


GOSTEI 0
Woinch

Woinch

07/07/2009

Utilize as seguintes funções para parar e iniciar o serviço:

//==============================================================================
function ServiceGetStrCode(ID : Integer): String;
begin
  case ID of
    SERVICE_STOPPED:          Result := ´STOPPED´;
    SERVICE_RUNNING:          Result := ´RUNNING´;
    SERVICE_PAUSED:           Result := ´PAUSED´;
    SERVICE_START_PENDING:    Result := ´START/PENDING´;
    SERVICE_STOP_PENDING:     Result := ´STOP/PENDING´;
    SERVICE_CONTINUE_PENDING: Result := ´CONTINUE/PENDING´;
    SERVICE_PAUSE_PENDING:    Result := ´PAUSE/PENDING´;
  else
    Result := ´UNKNOWN´;
  end; //case
end;

//==============================================================================
function ServiceGetStatus(Machine, Service: String): DWord;
var
  SCHM,
  SCHS  : SC_HANDLE;
  SS    : TServiceStatus;
  DWStat: DWord;

begin
  DWStat := 0;
  SCHM := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);

  if (SCHM > 0) then
  begin
    SCHS := OpenService(SCHM, PChar(Service), SERVICE_QUERY_STATUS);

    if (SCHS > 0) then
    begin
      if (QueryServiceStatus(SCHS, SS)) then
        DWStat := SS.dwCurrentState;

      CloseServiceHandle(SCHS);
    end; //if
    CloseServiceHandle(SCHM);
  end; //if

  Result := DWStat;
end;

//==============================================================================
function TfrmPrincipal.ServiceRunning(Machine, Service: String): Boolean;
begin
  Result := (SERVICE_RUNNING = ServiceGetStatus(Machine, Service));
end;

//==============================================================================
function ServiceStopped(Machine, Service: String): Boolean;
begin
  Result := (SERVICE_STOPPED = ServiceGetStatus(Machine, Service));
end;

//==============================================================================
function ServiceStart(Machine, Service: String): Boolean;
var
  SCHM,
  SCHS  : SC_HANDLE;
  SS    : TServiceStatus;
  PTemp : PChar;
  DWChkP: DWord;

begin
  SS.dwCurrentState := 0;
  SCHM := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);

  if (schm > 0) then
  begin
    SCHS := OpenService(SCHM, PChar(Service), SERVICE_START or SERVICE_QUERY_STATUS);

    if(SCHS > 0)then
    begin
      PTemp := nil;

      if (StartService(SCHS, 0, PTemp)) 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; //while
        end; //if
      end; //if
      CloseServiceHandle(SCHS);
    end; //if
    CloseServiceHandle(SCHM);
  end; //if

  Result := (SERVICE_RUNNING = ss.dwCurrentState);
end;

//==============================================================================
function ServiceStop(Machine, Service: String): Boolean;
var
  SCHM,
  SCHS  : SC_HANDLE;
  SS    : TServiceStatus;
  DWChkP: DWord;

begin
  SCHM := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);

  if (SCHM > 0) then
  begin
    SCHS := OpenService(SCHM, PChar(Service), 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; //while
        end; //if
      end; //if
      CloseServiceHandle(SCHS);
    end; //if
    CloseServiceHandle(SCHM);
  end; //if

  Result := (SERVICE_STOPPED = SS.dwCurrentState);
end;


Para desinstalar o serviço basta executar o executável do serviço passando os parâmetros /uninstall. Isso você pode fazer dentro do Delphi chamando a função WinExec por exemplo.

Espero ter ajudado.


GOSTEI 0
Onjahyr

Onjahyr

07/07/2009

Grato, vou testar depois. Agora tô formatando o computador

valeu!


GOSTEI 0
N_informatica

N_informatica

07/07/2009

Meus caros.

Estou vivendo o seguinte dilema.

Preciso construir um serviço no windows que exiba um form como uma grid e fica lá esperando por instruções.

Exemplo: Ficara em um loop lendo uma tabela de onde receberá instruções para executar determinada tarefa.

Acontece que instalo o serviço starto ele e logo em seguida ele exibe uma mensagem de que foi parado pelo sistema pois não havia nada a ser executado.

Conto com a ajuda dos amigos.

abraço


GOSTEI 0
Onjahyr

Onjahyr

07/07/2009

Quanto ao form, na ideia anterior o form aparecia e o serviço continuava. Eu abria o form como ShowModal e enquanto tava aberto o serviço permanecia. Como você está fazendo? o que colocou nos eventos onExecute e OnStart???


GOSTEI 0
Woinch

Woinch

07/07/2009

Verifique que a propriedade Interactive do seu TService deve estar marcada como True.

Espero ter ajudado.


GOSTEI 0
POSTAR