IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Créer un service Windows avec Delphi 7 édition personnelle


Sujet :

Langage Delphi

  1. #1
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Par défaut Créer un service Windows avec Delphi 7 édition personnelle
    Bonsoir,

    J'ai développé sous Delphi 7 un petit serveur Syslog qui envoie les logs à une base de données mySQL.

    J'aimerais le convertir en service Windows. Le soucis est que la version Personnelle de Delphi 7 ne permet pas de créer de services Windows. (Je n'ai pas l'option dans Fichier > Nouveau). Et la classe TService n'est pas disponible.

    Y a-t-il un moyen, avec les fonctions de l'API Windows ou autres, de créer un service Windows avec la version personnelle de Delphi 7 ?

    Merci d'avance et bonne soirée.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par fab56 Voir le message
    J'aimerais le convertir en service Windows. Le soucis est que la version Personnelle de Delphi 7 ne permet pas de créer de services Windows. (Je n'ai pas l'option dans Fichier > Nouveau). Et la classe TService n'est pas disponible.

    Y a-t-il un moyen, avec les fonctions de l'API Windows ou autres, de créer un service Windows avec la version personnelle de Delphi 7 ?
    La classe TService ne sert qu'à encapsuler les appels aux API windows qui permettent de gérer les services.
    On peut donc tout à fait créer un service avec la version personnelle de Delphi 7.

    Cette page présente un squelette de service écrit avec Delphi, en appelant directement les API windows. Il suffira d'adapter le squelette en fonction de vos besoins :
    http://www.cromis.net/blog/2011/04/h...ce-executable/

    Si par malchance, la version personnelle ne disposait pas de l'unité WinSvc, il suffira de redéclarer les interface d'appels aux API (constantes, prototypes des fonctions et procédures, etc).

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    j'ai créé une unité à cette fin sous Delphi 2

    http://tothpaul.free.fr/sources.php?tools.ntservice
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Par défaut
    Bonjour, merci pour les réponses

    J'ai essayé de mettre l'unité sous forme d'objet mais ce n'est pas un succès pour l'instant.

    En fait je me rends compte qu'il y a plusieurs choses que je ne comprends pas avec le service. Dans cet exemple, l'exécutable s'installe lui-même en temps que service ? dans quelle procédure dois-je implémenter mon code ? Dois-je prendre des précautions particulières dans ma façon de coder dans un service. (threads, mémoire, etc...)

    Merci d'avance pour votre aide.

    P.S. : Paul, votre site n'est pas accessible.
    P.S2 : Je suis en pleine découverte de Lazarus, qui propose le paquet lazDaemon (avec une classe toute faite) mais j'ai encore des soucis pour utiliser correctement les composants base de données

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    bonjour,

    le site fonctionne pourtant...

    un service c'est une application Windows qui se déclare comme service en appelant StartServiceCtrlDispatcher() qui est supposé se faire dans le thread principal...mais c'est un appel bloquant qui ne rend la main que que le service se termine, alors pour les besoin de Delphi on placera cela dans un Thread secondaire

    la fonction donnée en paramètre est le point d'entré du service, il utilise RegisterServiceCtrlHandler() pour recevoir les demandes de modifications (arrêt, suspendre...) et fait appelle à SetServiceStatus() pour notifier des changements d'état, sous peine de quoi Windows peu décider de le tuer (pas de réponse du service).

    voici un extrait d'une classe que j'ai créé pour gérer tout cela...TServiceControler.Run fonction plus ou moins comme TApplication.Run

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    procedure TServiceControler.Run;
    begin
      Log('Démarrage du service');
      TServiceThread.Create(False); // Thread qui se charge de ce qui est énoncé ci-dessus
     
      // Chargement de la configuration
      LoadConfig;
     
      Log('Le service est en place');
      FTimer := SetTimer(0, 0, 10000, @TimerProc); // relance un traitement suivant un timer
     
      repeat
        if FOnTimer then // il est temps de faire un traitement
        begin
          FOnTimer := False;
          ProcessTasks;
        end;
        if CheckSynchronize = False then // important pour les TThread de Delphi
        begin
          WaitMessage; // le faire avant le ProcessMessages sinon le test de Until peut ne jamais avoir lieu
        end;
        Application.ProcessMessages; // traiter les messages du Thread principal
      until Application.Terminated; // jusqu'à la fin de l'application (en fait la fin de TServiceThread qui appelle Application.Terminate)
     
      Log('Fermeture du Service');
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Par défaut
    Bonsoir,

    Tout d'abord, désolé pour la réponse tardive, j'ai travaillé à éditer une version "console" de mon programme.

    Pour le site, je suis actuellement à l'étranger et apparemment je n'ai pas accès à tout le domaine free.fr ^^'

    Donc pour l'instant j'ai mon programme plus que basique qui intercepte les messages Syslog et qui les enregistre sur une base de données mySQL, avec un petit système de filtrage des plus rudimentaire en sus.

    A présent, il faut vraiment que j'en fasse un service pour le tester sur un serveur Windows.

    Donc pour ce que tu m'as dit, je dois donc créer un thread tout simple dans lequel je fais appel à StartServiceCtrlDispatcher() ?

    J'essaie ça dans la semaine et je vous tiens au courant

    Merci

  7. #7
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Par défaut
    Voici le code de traitement principal de mon programme

    * Initialisation de mySQL
    * Initialisation de TIdSyslogServer (écoute sur port 514)
    * Boucle de traitement qui reconnecte simplement mysql en cas de Déconnexion

    * Le traitement des messages Syslog est opéré dans une méthode OnSyslog attaché au serveur. Le composant TIdSyslogServer est initialisé avec la propriété ThreadedEvent à true.

    Le composant créer donc un thread séparé pour le traitement de message.
    La boucle principal pourrait très bien se résumer à Où dois-je donc placé mon appel à StartServiceCtrlDispatcher ? J'ai essayé de prendre le code de ce site, mais adapter le code à une utilisation au sein d'un thread, ça me semble compliqué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Write(CR, 'Init mysql...');
      if InitMySQL then // Si l'initialisation de mySQL est OK
      begin
        if InitSyslog then // Et si init du serveur syslog OK
        begin
           Write(CR, 'Server successfully started. Working.', CRLF);
           while Run do  
           begin
             ...
             // Traitement ...
           end;
           BeforeEnd;
        end
        else
          Writeln(LastErrMess);
      end
      else
        Writeln(LastErrMess);
    Voilà pour les détails.

    Merci

    Bonne soirée

  8. #8
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Février 2005
    Messages : 242
    Par défaut
    Pas d'idées ?

Discussions similaires

  1. [Débutant] Créer un service windows avec C++Builder10
    Par KISEKI dans le forum C++Builder
    Réponses: 5
    Dernier message: 25/03/2011, 09h36
  2. Comment créer un service Windows en c# avec Delphi2005
    Par fplanglois dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 14/11/2006, 20h30
  3. créer un service windows avec TService
    Par youcef81 dans le forum C++Builder
    Réponses: 4
    Dernier message: 02/10/2006, 20h20
  4. Service Windows avec Delphi.net
    Par Alibaba126 dans le forum Delphi .NET
    Réponses: 4
    Dernier message: 04/09/2006, 11h42
  5. [Eclipse] créer un service Windows avec Eclipse
    Par tck-lt dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/09/2005, 17h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo