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 :

Transformer un exe delphi en service windows


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut Transformer un exe delphi en service windows
    Bonjour,

    j'ai crée un projet delphi que je dois faire tourner même à station fermée. càd qu'il doit tourner sur un serveur sans pour autant avoir besoin d'un utilisateur loggé pour ce faire.
    Je me suis documenté sur le sujet et - parait-il - il faut le transformer en service Windows.
    J'ai relu la doc microsoft et delphi sur le sujet, et je veux savoir si c'est vraiment faisable! et si c'est le cas comment faut-il s'y prendre pour le faire.

    Si qqn s'y connait, je suis preneur

    Merci

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    c'est possible en créant un nouveau projet, tu as 'service' dans les styles de projets dispo...
    Après tu peux d'une manière ou une autre linker ton projet, ou point d'entrée.

    Attention au accès style lecteur mappé, qui ne le sont qu'après login...
    je le dis juste au cas ou
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    J'ai fait cela une fois et tres simplement.

    Tu crées un service windows avec delphi qui exécute ton application avec un createprocess ou shellexecute et ca suffit.
    Bien sur il faut convenablement configurer le service pour qu'il demarre même si le serveur n'est aps logué ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Il est possible de transformer directement un .exe en service sans recompilation.
    Quelqu'un l'a fait avec un executable que j'avais dévellopé.

    je sais pas comment il a fait.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    bon, j'ai pu créer une appli comme un service windows sous delphi.
    ça parait simple. je l'ai essayé sur mon poste en utilisant le compte par défaut (compte système local) et ça marche.

    Mais comment faire pour que ça tourne sur un serveur? et comment paramétrer pour que ça puisse tourner même s'il n'y a aucune session ouverte.

    Merci bp

  6. #6
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    salut,
    le mieux, sur un serveur, c'est d'avoir un compte dédié au service si possible avec les droits administrateur sinon au moins "ouvrir une session entant que service"
    Ensuite à ton projet service, dans les propriétés du service tu as "ServiceStartName" et "Password" qui correspondent au compte exécutant dans l'onglet connexion d'un service windows. donc tu n'a plus qu'à les renseigner.
    Ton service utilisera le compte deédié poour ce lancer mais aucune session n'est ouverte.
    le fin du fin s'est de renseigner les failures actions (onglet récupération d'unn service windows) mais là delphi ne publie pas les propriétés, il faut écrire dans la base de registre au niveau:
    SYSTEM\CurrentControlSet\Services\ + Le nom delphi de ton TService
    et écrire la valeur binaire FailureActions correspondante à ce que tu veux (regarde sur ta machine quelle valeur est inscrite et qu'est ce que tu retrouve dans l'onglet du service windows.

    Sinon l'objet TService te propose des événements:
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceDestroy(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);

    dans lesquels tu peux appellés des procedures ou fonctions delphi, la doc est assez complète sur ces événements (cf. F1 sur TService/Utilisation d'un tservice)
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    et ça je peux le faire depuis ma machine?? si oui, où renseigner que le service tourne sur le serveur.

    et puis si j'ai bien compris, si je fixe l'action à faire en cas de défaillance (onglet récupération), ça ne se reporte pas forcément sur lle service? et encore moins sur la base des registres?

    et finalement, je ne trouve pas le nom de mon service sous :
    "SYSTEM\CurrentControlSet\Services\ + Le nom delphi de ton TService"
    c normal?

  8. #8
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    et ça je peux le faire depuis ma machine?? si oui, où renseigner que le service tourne sur le serveur.
    je ne comprends pas exactement ce que tu veux dire mais pour installer ton executable en tant que service windows tu dois l'éxecuter avec les paramètres "Path\ton exe" /INSTALL. donc tu dois executer cette "installation" sur la machine où tu souhaite qu'il tourne.

    et puis si j'ai bien compris, si je fixe l'action à faire en cas de défaillance (onglet récupération), ça ne se reporte pas forcément sur lle service?
    les failures actions sont définies pour un service donné

    et encore moins sur la base des registres?
    explique moi ce que tu veux dire par là...

    et finalement, je ne trouve pas le nom de mon service sous :
    "SYSTEM\CurrentControlSet\Services\ + Le nom delphi de ton TService"
    c normal?
    oui tant que tu n'as pas executer "Path\ton exe" /INSTALL la clé n'existeras pas.
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    Ah si si, il est bel et bien installé (d'ailleurs il tourne, mé je ne le trouve pas sur la base des registres!).


    sinon, pour les failure Action, je sais bien que c'est défini pour un service donné. je répliquais par rapport à :

    delphi ne publie pas les propriétés, il faut écrire dans la base de registre
    au niveau:
    SYSTEM\CurrentControlSet\Services\ + Le nom delphi de ton TService
    et écrire la valeur binaire FailureActions correspondante à ce que tu veux (regarde sur ta machine quelle valeur est inscrite et qu'est ce que tu retrouve dans l'onglet du service windows.


    comme je trouve dans l'onglet Récupération un moyen de le faire, pourkoi aller dans la base des registres?

    Merci

  10. #10
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    ct pour l'installation (au sens installshield) de ton exe sur un poste au moins il été préconfiguré...
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    ça n'explique tjs pas pkoi je ne trouve pas le nom de mon service dans la base des registres. et d'ailleurs comment je pourrais changer ce nom depuis le code??

    j'ai essayé ça mais ça ne marche pas :
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private
        FdisplayName: string;
        procedure SetdisplayName(const Value: string);
        { Private declarations }
      public
        property displayName: string read FdisplayName write SetdisplayName;
    ...
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TService1.SetdisplayName(const Value: string);
    begin
      FdisplayName := Value;
    end;
    ou est ce que j'écris "Service1.DisplayName := 'XXXX';" ?
    [moderation]
    Prière d'utiliser les balises de code. Cordialement,Hauwke|/moderation]

  12. #12
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    ou est ce que j'écris "Service1.DisplayName := 'XXXX';" ?
    oui

    mais dans la base de registre tu recherche le nom affiché dans le gestionnaire service windows (qui correspond au displayname en effet) ou le nom que tu as donné à ton TService (la propriété name) du type: 'FMonService' :
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  13. #13
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    justement je n'arrive pas à changer le DisplayName avec le code que je viens de poster.

    par défaut, il me met DELPHI FR SERVICE dans le gestionnaire!!

    voici tout le code:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
      ExtCtrls;
     
    type
      TService1 = class(TService)
        Timer1: TTimer;
        Timer2: TTimer;
        procedure ServiceExecute(Sender: TService);
        procedure Timer1Timer(Sender: TObject);
        procedure Timer2Timer(Sender: TObject);
      private
        FdisplayName: string;
        procedure SetdisplayName(const Value: string);
        { Private declarations }
      public
        function GetServiceController: TServiceController; override;
        property displayName: string read FdisplayName write SetdisplayName;
     
        { Public declarations }
      end;
     
    var
      Service1: TService1;
     
    implementation
     
    {$R *.DFM}
     
    procedure KillProgram(ClassName: PChar; Titre: PChar);
    const
        PROCESS_TERMINATE = $0001;
    var
        ProcessHandle : THandle;
        ProcessID: Integer;
        Appli : HWND;
    begin
        Appli := FindWindow(PChar(ClassName), PChar(Titre));
        GetWindowThreadProcessID(Appli, @ProcessID);
        ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
        TerminateProcess(ProcessHandle,4);
    end;
     
    procedure ServiceController(CtrlCode: DWord); stdcall;
    begin
      Service1.Controller(CtrlCode);
    end;
     
    function TService1.GetServiceController: TServiceController;
    begin
      Result := ServiceController;
    end;
     
    procedure TService1.ServiceExecute(Sender: TService);
    begin
    Service1.DisplayName := 'XXXX';
    MessageBox(0, 'Start', PChar(Service1.DisplayName), MB_OK);
     while not Terminated do
        ServiceThread.ProcessRequests(True);// attend l'apel de fermeture par windows
    end;
     
    procedure TService1.SetdisplayName(const Value: string);
    begin
      FdisplayName := Value;
    end;
     
    procedure TService1.Timer1Timer(Sender: TObject);
    begin
    WinExec('calc.exe', SW_SHOWNORMAL);
    Timer1.Enabled := false;
    Timer2.Enabled := true;
    end;
     
    procedure TService1.Timer2Timer(Sender: TObject);
    begin
    KillProgram(nil,'Calculatrice');
    Timer2.Enabled := false;
    Timer1.Interval := 5000;
    Timer1.Enabled := true;
    end;
     
    end.
    ++++++++++++++++++++

    J'ai toujours DELPHI FR SERVICE comme DisplayName
    [moderation]
    Prière d'utiliser les balises afin que vos messages soient plus lisibles par les autres posteurs, d'avance merci de bien vouloir prendre en compte nos observations
    Cordialement, hauwke [/moderation]

  14. #14
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      private
        FdisplayName: string;
        procedure SetdisplayName(const Value: string);
        { Private declarations }
      public
        function GetServiceController: TServiceController; override;
        property displayName: string read FdisplayName write SetdisplayName;
    FDisplayName, SetDisplayName et displayName sont à supprimer.

    Ton objet TService a déja une propriété DisplayName que tu peut renseigner en conception (le panneau des inspecteur d'objects Delphi).
    Puis il a une propriété Name qui l'identifie en tant qu'objet Delphi mais aussi dans la base de registre et le gestionnaire de service c'est donc un nom unique.
    La propriété ServiceStartName correspoind quant à elle au nom du compte executant.
    Je sais c'est pas clair au début....
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  15. #15
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    bon
    l'inspecteur d'objets ne renseigne rien !! hormis le nom de la classe!

    j'ai trouvé mon service dans la base des registres sous le nom Service1.
    la valeur de la clé DisplayName est DELPHI FR SERVICE.

    pleaaaaaaaaaaz dis moi une fois pour toutes comment changer ce p... de DisplayName (sans passer par les registres) et surtout d'où provient le nom Delphi FR SERVICE que j'ai jamais renseigné nullepart.

    il va me rendre fouuuuuuu!!

    Merci bp.

  16. #16
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    autant pour moi
    Delphi FR service est bel et bien ds l'inspecteur d'objets!
    mais comment le changer depuis le code???????
    Où je m'écris?

    j'ai essayé de mettre Service1.displayname:= 'xxx' dans l'event onexecute, mais le displayname reste le même

  17. #17
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    Bon j'ai trouvé..
    c moi qui m'embrouille tout seul en fait..

    Merci de ta patience :-)

  18. #18
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    l'inspecteur d'objets ne renseigne rien !! hormis le nom de la classe!
    pas normal, moi j'ai :
    AllowPause
    AllowStop
    Dependencies
    DisplayName
    ErrorSeverity
    Interactive
    LoadGroup
    Name
    OldCreateOrder
    Password
    ServiceStartName
    ServiceType
    StartType
    Tag
    TagID
    WaitHint


    Donc il vaut mieux desinstaller ton service ("path\tonexe" /UNINSTALL), renseigner le DisplayName (s'il apparait mais bon à moins que tu ai un delphi < 5), recompiler le projet, et reinstaller le service ("path\tonexe" /INSTALL).
    Et une fois pour toute , en le spécifiant à la conception ça marche !
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  19. #19
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    de rien je connais les prises de tête
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  20. #20
    Membre à l'essai
    Inscrit en
    Mai 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 42
    Points : 11
    Points
    11
    Par défaut
    par contre, ya un truc qui me chiffonne encore

    que veux tu dire par delphi be publie pas les propriétes (en parlant des failure actions)?

Discussions similaires

  1. [Débutant] Lancer un .exe depuis un service windows.
    Par egautier18 dans le forum C#
    Réponses: 5
    Dernier message: 27/03/2014, 15h02
  2. Problème python lancer un .exe dans son service windows python
    Par leyer dans le forum Général Python
    Réponses: 1
    Dernier message: 02/04/2010, 04h07
  3. Réponses: 2
    Dernier message: 26/11/2008, 17h00
  4. Service Windows avec Delphi.net
    Par Alibaba126 dans le forum Delphi .NET
    Réponses: 4
    Dernier message: 04/09/2006, 11h42
  5. Transformer un programme java en service windows
    Par daninho dans le forum Général Java
    Réponses: 41
    Dernier message: 15/01/2006, 18h36

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