Para instalar serviços você deve seguir as etapas de Instalar aplicações, contudo serviços requerem etapas adicionais:

  1. Um executável que possa ser carregado como serviço:
    1. Você pode preparar o seu executável para ter essa capacidade ou;
    2. 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.
  2. Que esse executável seja registrado como serviço e configurado para rodar automaticamente;
  3. 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;
  • Sem rótulos