Para instalar serviços você deve seguir as etapas de Instalar aplicações, contudo serviços requerem etapas adicionais:
- Um executável que possa ser carregado como serviço:
- Você pode preparar o seu executável para ter essa capacidade ou;
- Você pode utilizar um service manager, que carrega o seu executável como um serviço. Para essa finalidade nós utilizamos e recomendamos o NSSM.
- Que esse executável seja registrado como serviço e configurado para rodar automaticamente;
- O serviço deve ser parado durante uma reinstalação.
Por simplicidade, vamos ver como utilizar o NSSM para transformar um executável qualquer em um serviço.
Criando um serviço usando NSSM
Adicione o executável do NSSM em 32bits para ser copiado para a mesma pasta do seu executável:
[Files] ; (... outros arquivos..) Source: "nssm\nssm.exe"; DestDir: "{app}\plugins\{#ExtensionName}"; Flags: skipifsourcedoesntexist ignoreversion recursesubdirs restartreplace overwritereadonly;
Agora, vamos criar um serviço meu_servico. Cada comando a seguir possuirá uma linha comentando o que ele faz:
[Run] ; Instalo o serviço informando o nome e o caminho do MeuExecutavel.exe com parâmetro "runserver" Filename: "{app}\plugins\{#ExtensionName}\nssm.exe"; Parameters: "install meu_servico ""{app}\plugins\{#ExtensionName}\MeuServico.exe runserver"""; Flags: runhidden waituntilterminated ; Ajusto o nome de exibição Filename: "{app}\plugins\{#ExtensionName}\nssm.exe"; Parameters: "set meu_servico DisplayName ""Meu Servico"""; Flags: runhidden ; Ajusto a descrição Filename: "{app}\plugins\{#ExtensionName}\nssm.exe"; Parameters: "set meu_servico Description ""Minha descrição"""; Flags: runhidden ; Start do servidor Filename: "{app}\plugins\{#ExtensionName}\nssm.exe"; Parameters: "start meu_servico"; Flags: runhidden
Por fim, não esqueça de adicionar um comando para parar o seu serviço no começo da instalação, caso contrário o instalador falhará pois os arquivos não serão substituídos:
[Code] function PrepareToInstall(var NeedsRestart: Boolean): String; var ResultCode: integer; begin Exec('net.exe', 'stop meu_servico', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); end;