Win32 Service em delphi parando...

Delphi

08/06/2012

Olá estou criando um service para deixar rodando em um servidor,o que acontece é que ao instalar ou mandar executar ele o executa e logo depois fecha, eu adicionei no OnExecute para que ele não faça isso da seguinte maneira:
procedure TServiceWin.ServiceExecute(Sender: TService);
begin
  SalvarLog(Execução do serviço);
  //While not usado para que o mesmo continue sendo executado, sem encerrar o serviço
  while not self.Terminated do
    ServiceThread.ProcessRequests(true);
end;


O problema é que ao debugar meu serviço não está sequer passando pelo ServiceExecute,ele passa apenas pelo ServiceCreate e pelo ServiceDestroy, cheguei até a tentar mudar o ServiceThread para o OnCreate do serviço para que ao Criar já definisse que executa-se o mesmo porém não deu certo.

Segue o codigo completo.



unit Service;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  Menus, ExtCtrls, ImgList, ShellApi, AppEvnts, Variants, Forms, Buttons,
  StdCtrls;

const
  WM_ICONTRAY = WM_USER + 1;

type
  TServiceWin = class(TService)
    tmrAcao: TTimer;
    popMenu: TPopupMenu;
    Parametros1: TMenuItem;
    Pausar1: TMenuItem;
    Retormar1: TMenuItem;
    Sair1: TMenuItem;
    procedure tmrAcaoTimer(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
    procedure ServiceAfterInstall(Sender: TService);
    procedure ServiceAfterUninstall(Sender: TService);
    procedure ServiceBeforeInstall(Sender: TService);
    procedure ServiceBeforeUninstall(Sender: TService);
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceDestroy(Sender: TObject);
    procedure Sair1Click(Sender: TObject);
    procedure Pausar1Click(Sender: TObject);
    procedure Retormar1Click(Sender: TObject);
  private
    TrayIconData: TNotifyIconData;
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    procedure TrayMessage(var Msg: TMessage); message WM_ICONTRAY;
    { Public declarations }
  end;

var
  ServiceWin: TServiceWin;

implementation

uses DataModule, Formulario;

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  ServiceWin.Controller(CtrlCode);
end;

function TServiceWin.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

//Metodo a ser chamado para utilizar o log
procedure SalvarLog(Msg: String);
var
  logLista: TStringList;
begin
  //Cria a pasta para uso
  if not DirectoryExists(C:\Teste) then
  ForceDirectories(c:\servicoNFE);
  Try
    //Cria uma string list para armazenar os logs
    logLista := TStringList.Create;
    try //Se o log já existir carrega ele
      if FileExists(c:\servicoNFE\log.log) then
      begin
        logLista.LoadFromFile(c:\servicoNFE\log.log);
        //Adiciona o registro no log
        logLista.Add(timetostr(now) + : + Msg);
      end;
    except
      on e: exception do
        logLista.Add(timetostr(now) + : ERRO + E.Message);
    end;
    finally
      //Salva o log
      logLista.SaveToFile(c:\servicoNFE\log.log);
      //Libera a lista
      logLista.Free;
    end;
end;

//Chama os parametros de impressão e inicializa a impressão
procedure Imprimir();
var
  Imprimir:Boolean;
begin
  Imprimir := frmParametros.radBtnSim.Checked;
  if Imprimir = True then
  begin
    frmParametros.printDialog.Copies := StrToInt(frmParametros.edtVias.Text);
    frmParametros.printDialog.Execute;
  end;
end;

//Metodo de execução do serviço
procedure TServiceWin.ServiceExecute(Sender: TService);
begin
  SalvarLog(Execução do serviço);
  //While not usado para que o mesmo continue sendo executado, sem encerrar o serviço
  while not self.Terminated do
    ServiceThread.ProcessRequests(true);
end;

procedure TServiceWin.ServiceAfterInstall(Sender: TService);
begin
  SalvarLog(Apos instalação);
  ShowMessage(Serviço adicionado);
end;

procedure TServiceWin.ServiceAfterUninstall(Sender: TService);
begin
  SalvarLog(Após desinstalar);
  ShowMessage(Serviço removido);
end;

procedure TServiceWin.ServiceBeforeInstall(Sender: TService);
begin
  SalvarLog(Antes de instalar);
end;

procedure TServiceWin.ServiceBeforeUninstall(Sender: TService);
begin
  SalvarLog(Antes de desinstalar);
end;


//Quando a mesma é criada
procedure TServiceWin.ServiceCreate(Sender: TObject);
begin
  //Log de que o mesmo foi criado
  SalvarLog(Serviço criado);

  //Cria o trayicon
  with TrayIconData do
  begin
    cbSize := SizeOf(TNotifyIconData);
    //Wnd := Self.Handle;
    uID := 0;
    uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
    //uCallbackMessage := WM_ICONTRAY;
    hIcon := ExtractIcon(application.handle,D:\Meus Documentos\NFE service\imgs\play.ico, 0);
    StrPCopy(szTip, Application.Title);
  end;
  Shell_NotifyIcon(NIM_ADD, @TrayIconData);
  
end;


procedure TServiceWin.ServiceDestroy(Sender: TObject);
begin
  //Salva no log o momento em que o service foi fechado
  SalvarLog(Serviço destruido);
  //Remove o trayicon
  Shell_NotifyIcon(NIM_DELETE, @TrayIconData);
end;

//Metodo para quando o timer chegar ao tempo pre-definido
procedure TServiceWin.tmrAcaoTimer(Sender: TObject);
begin
  SalvarLog(Execução do timer);
  //Desliga o timer para que faça todas as notas
  tmrAcao.Enabled := False;
  //NOTA: Coluna status(tinyint) 0 = Não enviado 1 = Enviado 2 = Erro
  //Seta a query para o 1º Registro
  dmServico.adoqStatus.First;
  //FOR para executar as notas com status para ser enviada
  while not dmServico.adoqStatus.Eof do
  begin
    //Chamar o metodo de envio da NFE para todas as notas listas




    
    dmServico.adoqStatus.Next;
  end;
  //Ativa o timer após verificar todas as notas
  tmrAcao.Enabled := True;
end;

procedure TServiceWin.TrayMessage(var Msg: TMessage);
var
  cursor : TPoint;
begin
  case Msg.lParam of
    WM_LBUTTONDOWN:
    begin
      frmParametros.Show;
    end;
    WM_RBUTTONDOWN:
    begin
       //SetForegroundWindow(Handle);
       GetCursorPos(cursor);
       popMenu.Popup(cursor.x, cursor.y);
       //PostMessage(Handle, WM_NULL, 0, 0);
    end;
  end;
end;

//Encerra o serviço (chamado pelo popupMenu)
procedure TServiceWin.Sair1Click(Sender: TObject);
begin
  SalvarLog(Serviço desligado);
  Application.Terminate;
end;

//Pausa o serviço  (chamado pelo popupMenu)
procedure TServiceWin.Pausar1Click(Sender: TObject);
begin
  //Desliga o timer e depois altera o icone do trayicon
  tmrAcao.Enabled := False;
  TrayIconData.hIcon := ExtractIcon(application.handle,D:\Meus Documentos\NFE service\imgs\stop.ico, 0);
  SalvarLog(Serviço pausado);
end;

//Retoma o serviço   (chamado pelo popupMenu)
procedure TServiceWin.Retormar1Click(Sender: TObject);
begin
  //Ativa o timer e depois altera o icone do trayicon
  tmrAcao.Enabled := True;
  TrayIconData.hIcon := ExtractIcon(application.handle,D:\Meus Documentos\NFE service\imgs\play.ico, 0);
  SalvarLog(Serviço Retomado);
end;



end.
Darcio Junior

Darcio Junior

Curtidas 0
POSTAR