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

API, COM et SDKs Delphi Discussion :

Service NT HS


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347
    Par défaut Service NT HS
    Bonjour,

    J'ai créé un démon qui fonctionne très bien mais je l'avais crée en type "application" alors qu'il ne se sert d'aucune "form".
    J'ai en plus eu l'idée d'en faire un service NT, ce qui est le plus approprié.

    Le problème c'est que j'ai l'impression que mon démon ne vie pas..
    N'ayant pas accès en debug au service créé, je sais même pas si il est rééllement créé, d'autant que j'ai constaté que :
    L'Event ServiceStart: n'ai jamais appelé (meme aprés un net start "service"..)
    et que même sur le event ServiceExecute, j'ai des doutes..

    Alors question: Pourquoi ces events ne sont levés malgré que mon service est démarré.
    Pourquoi mon application fonctionne bien en autonome et pas du tout en service ? Dois je créé un thread en plus dans le service, ou j'executerai mon application ?

    Merci davance

    PS: le code d'exemple avec un timer fonctionne bien. Mais c'est justement exploiter un service sans utiliser de timer que tout se complique...


    EDITER:
    Je me trompe peut etre mais il semblerait qu'une personne est rencontré le même probleme que moi :http://17slon.com/blogs/gabr/2006/07...-services.html (mais le source est corrompu en delphi5)
    Le problème s'est que je ne parle pas anglais. Je ne comprend pas donc si c'est exactement le même problème et commet il le résoud. Pourriez vous m'aider ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Par défaut
    Il faut que tu postes un minimum de code pour qu'on puisse t'aider.

    Globalement, un service Windows a beaucoup de limitations (contexte d'exécution, droits, etc.) que n'a pas une application classique. La conversion n'est donc pas trivilale.

    Donc déjà, pas de TTimer dans un service, mais pourquoi en faire usage, d'ailleurs ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347
    Par défaut
    Bonjour Reisubar,

    Je comprend bien ta remarque, j'ai donc mis un programme que j'ai fait résumant bien mon problème sur (Delphi 5): http://dl.free.fr/qJ3qDx4IK

    Ce projet (tiré des 2 sites cités) est juste un service NT tout bête.
    Les logs de cette application sont dans c:\ServiceDemo.log dont voici le contenu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ServiceCreate from process 2452 thread 1428
    ServiceCreate from process 2744 thread 2564
    ServiceStart from process 2744 thread 2124
    TestWriteRegedit called from process 2744 thread 2124
    ServiceExecute from process 2744 thread 2124
    ServiceStop from process 2744 thread 2124
    ServiceCreate from process 1484 thread 3432
    Ce programme fait juste appel dans ServiceStart à la fonction TestWriteRegedit. Cette fonction écrit dans la base de registre HKCI\Software à valeur: un string et un booléan.
    (Attention,HKCU\Software écrire est pas top, j'ai oublié de le mettre dans un dossier, désolé).Bon de toute facon en exécutant le programme.. On passe bien dans la fonction mais rien est écrit !!
    Je ne comprend donc pas pourquoi ???!!



    Pour tester entrer les commandes suivant dans cmd:
    ServiceTest.exe /install
    net start ServiceTest
    net stop ServiceTest
    ServiceTest.exe /uninstall

    Extrait de 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
     
    procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
    begin
      Log(Format('ServiceStart from process %d thread %d',
        [GetCurrentProcessID, GetCurrentThreadID]));
      TestWriteRegedit();
      Started := true;
    end;
     
     
    procedure TService1.TestWriteRegedit();
    var reg: TRegistry;
    begin
      Log(Format('TestWriteRegedit called from process %d thread %d',
          [GetCurrentProcessID, GetCurrentThreadID]));
      try
      reg := TRegistry.Create;
      reg.RootKey := HKEY_CURRENT_USER;
      reg.OpenKey('\Software', false);
      reg.WriteString('TestString', 'OK');
      reg.WriteBool('TestBoolean',true);
      reg.CloseKey;
      except
        Log(Format('TestWriteRegedit EXCEPT called from process %d thread %d',
          [GetCurrentProcessID, GetCurrentThreadID]));
      end;
     
    end;
    PS Reisubar: "Smortex" vient de spectroms en verlant

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Par défaut
    Cette fonction écrit dans la base de registre HKCI\Software à valeur: un string et un booléan.
    Je pense que tu ne regardes pas au bon endroit pour vérifier si l'écriture a fonctionné ou pas. HKCU est mappé sur la branche associée au compte sous lequel tourne le service, qui n'est par défaut pas le même que celui qui est interactif. Donc quand tu vérifies via regedit l'écriture, il est normal que tu ne voies rien dans HKCU car ce n'est pas la même branche qui est affichée dans le contexte de ta session, quand tu utilises regedit. Dans ton cas, HKLM semble être plus recommandé.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      try
      reg := TRegistry.Create;
      reg.RootKey := HKEY_CURRENT_USER;
      reg.OpenKey('\Software', false);
      reg.WriteString('TestString', 'OK');
      reg.WriteBool('TestBoolean',true);
      reg.CloseKey;
      except
        Log(Format('TestWriteRegedit EXCEPT called from process %d thread %d',
          [GetCurrentProcessID, GetCurrentThreadID]));
      end;
    Tu devrais utiliser un autre try...finally pour libérer l'objet assigné à Reg, car là tu crées une fuite de mémoire.

    PS Reisubar: "Smortex" vient de spectroms en verlant
    Mhh... j'ai rien compris mais on va mettre ca sur le compte de l'heure tardive

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347
    Par défaut
    OK Reisubar,

    Tu as raison mon test fonctionne dans KEY_Local_MACHINE.
    Donc question bête: Comment faire pour que mon service utilise le meme compte que moi (comme c'est le cas pour mon appli autonome) ?

    PS: Bon vu que t'as pas compris,voici un indice: j'ai un vieil ami de lycée, mais que jai pas vu depuis longtemps. Il s'appel romain, et il m'a apporté une tarte-hier

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Par défaut
    Comment faire pour que mon service utilise le meme compte que moi (comme c'est le cas pour mon appli autonome) ?
    Deux options : le faire manuellement (Démarrer, exécuter, services.msc, ton service, propriétés, "exécuter sous le compte..."), ou soit automatiquement avec l'api ChangeServiceConfig :
    http://msdn.microsoft.com/en-us/libr...87(VS.85).aspx

    Attention: quoi qu'il en soit ton service, même si il fonctionne sous un compte interactif, ne pourra directement interagir avec le bureau. Il vit sa petite vie de service en autarcie.

    Bon vu que t'as pas compris,voici un indice
    OK, je vois, spectroms, ca me disait quelque chose

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 347
    Par défaut
    Bonjour Reisubar,

    T'as remarque très pertinente me fait douter. Explication des grandes ligne de mon projet:
    J'ai réalisé un sorte de anti virus qui scanne les programmes en cours dexecution, et trace les actions de l'utilisateur.
    Il n'a pas de Fenetre car c'est un démon. la partie admin étant déporté.

    J'ai donc pensé mettre mon démon en service, ce qui me semble logiciel et ce qui est courant je pense.
    Je t avourai que j'ai pas trouver beaucoup de documentation décrivant les services delphi hormis les 2 que jai cité.Je maitrise donc pas entièrement le sujet.
    Donc mes question sont:
    - Mon démon doit écrire dans la base de utilisateur courant et la lire (les paramètres y etant stocker).De plus je doit intéragir complément avec l'environnement de lutilisateur .Penses tu que c'est possible ?
    - Jai bien noté ta possibilité de préciser le compte à utiliser. Tout fois aucun des services que je connais utilise cette méthode (meme des services très ressemblant au mien).
    Comment font donc les autres ? Je ne vois pas l'interet d'un service si on peut rien faire avec ? Dois je abandonné mon idée de services ?

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Par défaut
    Mon démon doit écrire dans la base de utilisateur courant et la lire (les paramètres y etant stocker).
    Il n'y a pas de concept "d'utilisateur courant" depuis un service, ni dans Windows même. Windows est multi-user depuis XP (Fast User Switching) et Terminal Services.

    De plus je doit intéragir complément avec l'environnement de lutilisateur
    Certainement possible, ca dépend à quel degré d'interaction tu veut le faire... Depuis la session des services, tu peux enumérer les sessions ouvertes, t'attacher aux bureaux etc. Ca reste pas très très facile mais faisable. Le plus "raisonnable" reste de programmer une application utilisateur lancée dans toutes les sessions et de développement une communication avec des pipes.

    Tout fois aucun des services que je connais utilise cette méthode (meme des services très ressemblant au mien).
    Certainement parce cette méthode ne permet que d'hériter des droits utilisateur, mais ne permet pas d'intéragir avec eux.

    Je ne vois pas l'interet d'un service si on peut rien faire avec ?
    On peut faire tout un tas de trucs mais la communication inter session n'est pas super facile avec Windows

Discussions similaires

  1. Quel est l'intérêt des Services Web ??
    Par silvermoon dans le forum Débats sur le développement - Le Best Of
    Réponses: 19
    Dernier message: 12/02/2003, 22h28
  2. naming service
    Par manuel dans le forum CORBA
    Réponses: 6
    Dernier message: 09/12/2002, 17h43
  3. [VB6] Lancer un service, par exemple Sql Server
    Par fea dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 14h07
  4. develloppement avec ORBit: service d'evenement
    Par belmontv dans le forum CORBA
    Réponses: 3
    Dernier message: 06/06/2002, 22h56
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

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