Fórum Como criar um Application Service? #372060
07/07/2009
0
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
Curtir tópico
+ 0Posts
09/07/2009
Woinch
Ou você teria uma aplicação terceira que controlaria esse serviço?
Gostei + 0
09/07/2009
Onjahyr
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
11/07/2009
Onjahyr
up
Gostei + 0
13/07/2009
Woinch
//============================================================================== 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
13/07/2009
Onjahyr
valeu!
Gostei + 0
14/07/2009
N_informatica
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
14/07/2009
Onjahyr
Gostei + 0
14/07/2009
Woinch
Espero ter ajudado.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)