Win32 Service em delphi parando...
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:
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.
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
Curtidas 0