32 votes

Une application Delphi autonome qui peut également être installée comme service Windows

Dans Delphi, vous pouvez créer une application windows VCL Forms autonome. Vous pouvez également créer une application de service Windows.

Est-il possible de combiner les deux dans une seule application qui peut s'exécuter comme une application autonome et peut également être installé comme un service Windows?

49voto

gabr Points 20458

Tout à fait possible. L'astuce consiste à modifier la .rmr de créer des formulaire principal lorsque vous souhaitez exécuter dans une application et le service à la forme à laquelle vous souhaitez exécuter en tant que service. Comme ceci:

if SvComFindCommand('config') then begin
  //When run with the /config switch, display the configuration dialog.
  Forms.Application.Initialize;
  Forms.Application.CreateForm(TfrmConfig, frmConfig);
  Forms.Application.Run;
end
else begin
  SvCom_NTService.Application.Initialize;
  SvCom_NTService.Application.CreateForm(TscmServiceSvc, scmServiceSvc);
  SvCom_NTService.Application.Run;
end;

Le code ci-dessus utilise SvCom pour exécuter le service, mais exactement le même effet peut être obtenu en utilisant la norme TService.

J'ai écrit un article à ce sujet pour Le Delphi Magazine il y a plusieurs années. Vous pouvez le lire ici: de Nombreux Visages D'Une Application.

9voto

SimaWB Points 5786

Ce sera difficile à expliquer, mais je vais essayer de :)

Je l'ai fait dans mon projet comme ça (Delphi 5):

3voto

skamradt Points 13049

Un autre presque plus simple option est disponible à http://cc.embarcadero.com/item/19703, vous avez juste besoin d'inclure une unité et de changer votre RMR à quelque chose comme:

begin
  if CiaStartService('SERVICE NAME') then begin
    CiaService.CreateForm(TMain, Main);
    CiaService.Run;
    Exit;
  end;

  Application.Initialize;
  Application.Title := 'SERVICE NAME';
  Application.CreateForm(TMain, Main);
  Application.Run;
end.

Bien que cet exemple est assez daté, la technique est assez simple que ça fonctionne encore, même avec Delphi XE2. Avec ce lieu, votre application va continuer à fonctionner comme un non-service jusqu'à ce que vous utilisez "/install" paramètre (sur une invite de commande élevée). Après quoi, il va fonctionner comme un service jusqu'à ce que vous utilisez "/désinstaller" paramètre (également sur une invite de commande élevée).

2voto

avra Points 2794

Il existe une solution à ce problème sans écrire une seule ligne de code. Cela dépend un peu de votre application, mais généralement il est réalisable. Essayez ceci: http://iain.cx/src/nssm. N'oubliez pas de démarrer tous les services dont dépend votre application AVANT de commencer votre application en tant que service. Google autour d'informations sur la façon de le faire.

1voto

Ritsaert Hornstra Points 3751

C'est possible, mais dans ce cas, vous ne pouvez pas utiliser les TServiceApplication et TService normaux. Vous devez implémenter vous-même tout le code spécifique au service.

Nous avons eu un problème de similat et fait deux applications cadre: l'un pour le sable seul exe et un pour le service. Maintenant, nous pouvons créer un seul BPL / DLL qui est intégré dans les deux conteneurs.

Si vous voulez dépenser un peu d'argent: vous devriez regarder SvCOM, je pense qu'ils ont une solution au problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X