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

Windows Discussion :

Service windows vide ?


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 88
    Points : 53
    Points
    53
    Par défaut Service windows vide ?
    Bonjour,

    Je veux faire un service windows. J'ai réalisé un code largement inspiré de se trouvé sur le net, que vous trouverez ci dessous. Il a l'air de fontionné (start stop..).
    Mais il a un trop soucie ! J'e n'arrive pas à avoir la boucle du programme. Ainsi je ne peux donc rien executer avec. En effet, mes cout <<endl ne s'affiche jamais et mes messageBOx s'ouvre jamais non plus.
    Je me domande donc comment faire ?

    Merci davance



    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    // MyService.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    
    SERVICE_STATUS ServiceStatus;
    SERVICE_STATUS_HANDLE hServiceStatus;
    BOOL ServiceStarted=TRUE;
    void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
    void WINAPI ServCtrlHandler(DWORD Opcode);
    
    using namespace std;
    
    int InstallService()
    {   
        char strDir[1024];
        SC_HANDLE hSCManager,hService;
        SERVICE_DESCRIPTION SD;
    	TCHAR szPath[MAX_PATH]; 
    	GetModuleFileName( NULL, szPath, MAX_PATH );
        hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
        hService = CreateService(hSCManager, TEXT("MService"), TEXT("MService"),
           SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START,
                        SERVICE_ERROR_NORMAL, szPath, NULL, NULL, NULL, NULL, NULL);
        SD.lpDescription = TEXT("Ici la description de mon service.");
        ChangeServiceConfig2(hService, SERVICE_CONFIG_DESCRIPTION, &SD);
        CloseServiceHandle(hService);
    
        return 0;
    }
    
    void StartService()
    {
        SC_HANDLE SCMan;
        SCMan = OpenSCManager(NULL, NULL, GENERIC_EXECUTE) ;
    
        SC_HANDLE MonServ;
        MonServ = OpenService(SCMan, TEXT("MService"), SERVICE_START );
    
        StartService(MonServ, 0, NULL);
    
        CloseServiceHandle(MonServ);
        CloseServiceHandle(SCMan);
    }
    
    int MyServiceDelete()
    {
        SC_HANDLE hSCManager;
        SC_HANDLE hServ;
        hSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        hServ=OpenService(hSCManager,TEXT("MService"),SERVICE_ALL_ACCESS);
        DeleteService(hServ);
        CloseServiceHandle(hServ);
        CloseServiceHandle(hSCManager);
        return 0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
         if(argc == 2) {
            if(_tcscmp(argv[1], TEXT("-u")) == 0)
            MyServiceDelete();
    	    if(_tcscmp(argv[1], TEXT("-i")) == 0)
    		InstallService();
         }
        SERVICE_TABLE_ENTRY Table[] = {{TEXT("Service1"),ServiceMain},{NULL,NULL}};
    
    	StartServiceCtrlDispatcher(Table);
        return 0;
    }
    
    void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
    { 
        ZeroMemory(&ServiceStatus, sizeof(SERVICE_STATUS));
        ServiceStatus.dwServiceType = SERVICE_WIN32;
        ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
        ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
    
        hServiceStatus = RegisterServiceCtrlHandler(TEXT("MService"), ServCtrlHandler);
    
        ServiceStatus.dwCurrentState = SERVICE_RUNNING;
        ServiceStatus.dwCheckPoint = 0;
        ServiceStatus.dwWaitHint = 0;
    
        SetServiceStatus (hServiceStatus, &ServiceStatus);
    
        ServiceStarted=TRUE;
    
    
        while(ServiceStarted)
         {
    		 cout <<  "Test" << endl;
           Sleep(5000);
    	MessageBox(NULL, TEXT("InfoMsg"), TEXT("ServiceName"), MB_OK | MB_ICONINFORMATION);
           /* Ici la tache à éffectuer. */
         }
    }
    /******************************************************************************/
    
    void WINAPI ServCtrlHandler(DWORD SCCode)
    {
        switch(SCCode)
         {
          case SERVICE_CONTROL_CONTINUE:
              ServiceStatus.dwCurrentState = SERVICE_RUNNING;
              SetServiceStatus (hServiceStatus,&ServiceStatus);
              return;
          case SERVICE_CONTROL_PAUSE:
              ServiceStatus.dwCurrentState = SERVICE_PAUSED;
              SetServiceStatus (hServiceStatus,&ServiceStatus);
              return;
          case SERVICE_CONTROL_STOP:
              ServiceStatus.dwWin32ExitCode = 0;
              ServiceStatus.dwCurrentState = SERVICE_STOPPED;
              ServiceStatus.dwCheckPoint = 0;
              ServiceStatus.dwWaitHint = 0;
              SetServiceStatus (hServiceStatus,&ServiceStatus);
              ServiceStarted=FALSE;
              return;
         }
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Essaie déjà en rajoutant le paramètre MB_SERVICE_NOTIFICATION à ta MessageBox().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Dans l'appel à CreateService, il faut ajouter le flag SERVICE_INTERACTIVE_PROCESS au paramètre type de service.

    Passe SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS à la fonction....

    J'ai developpé pour le taf une librairie complète de gestion des services Windows que j'ai posté sur le site ...

    Tu peux y jeter un coup d'oeil :

    http://www.developpez.net/forums/sho...d.php?t=408239
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #4
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    J'ai repris ton bout de code... et l'ai apdaté à ma librairie..

    Cela n'est il pas plus simple et plus court ???

    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
    // MyService.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    #include <NTService.h>
     
    int MyServiceInstall()
    {   
        TCHAR  path[1024];
        SERVICE_INFO si = {0};
    
        GetModuleFileName(NULL, path, sizeof(path));
    
        si.lpDisplayName    = TEXT("MyService");
        si.lpDescription    = TEXT("Ici la description de mon service.");
        si.lpBinaryPathName    = path;
        si.dwServiceType    = SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS;  
        si.dwStartType        = SERVICE_DEMAND_START;
        si.dwErrorControl    = SERVICE_ERROR_NORMAL;
    
        return LocalServiceInstall(TEXT("MyService"), &si);
    }
     
     int MyServiceDelete()
    {
        return LocalServiceDelete(TEXT("MyService"));
    }
    
    void WINAPI MyServiceMain()
    {
        while (!ServiceIsTerminated())
        {
            if (ServiceGetCurrentStatus() == SERVICE_RUNNING)
            {
                MessageBox(NULL, TEXT("InfoMsg"), TEXT("MyService"), MB_OK | MB_ICONINFORMATION);        
            }
    
            ServiceSleep(5000);            
        }
    }
    
    int _tmain(int argc, TCHAR* argv[])
    {
        if(argc == 2) 
        {
                if(_tcscmp(argv[1], TEXT("-u")) == 0)
                    return MyServiceDelete();
    
                if(_tcscmp(argv[1], TEXT("-i")) == 0)
                    return MyServiceInstall();
        }
    
        return ServiceRun(TEXT("MyService"), MyServiceMain, 1000, SERVICE_ACCEPT_STOP);
    }
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Les services interactifs sont à déconseiller, car sont un trou de sécurité potentiel (FreeSSHD est un bon exemple de faille, voir la "SECURITY FLAW!" sur le forum).

    Je conseille de ne pas mettre le flag SERVICE_INTERACTIVE_PROCESS, et d'utiliser simplement les MessageBox() avec MB_SERVICE_NOTIFICATION quand nécessaire.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Médinoc a raison...

    Mais dans le contexte du post, c'était une solution qui permettait à Bugmenot de tester son embryon de service ...

    C'est tout ! Bien sur qu'en prod, c'est différent...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 88
    Points : 53
    Points
    53
    Par défaut
    Bonjour vicenzo,

    C'est presque parfait ! En effet, tu as très bien répondu à ma question, seul problème c 'est que ca fonctionne pas..
    J'ai plein d'erreurs..
    Je connais très très mal Visual mais je pense que c'est du que t'as librairy utilise des ressources et que possèdant Visual Express je n'ai pas accés aux MFC et aux ressources.

    Je peux me tromper..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1>n:\visual studio 2005\projects\myservice\myservice\myservice.cpp(5) : fatal error C1083: Cannot open include file: 'NTService.h': No such file or directory
    1>NTService.cpp
    1>n:\visual studio 2005\projects\myservice\myservice\ntservice.cpp(71) : error C2146: syntax error : missing ';' before identifier 'lpWorkerProc'
    1>n:\visual studio 2005\projects\myservice\myservice\ntservice.cpp(71) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>n:\visual studio 2005\projects\myservice\myservice\ntservice.cpp(71) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int....

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    ma librairie est une libraire C qui ne requiert donc pas mfc.

    Concernant les ressources, c'est l'éditeur de ressources qui n'est pas fournit avec VC express.
    De plus, les ressources fournies dans lib sont utilisées pour logger les évènement dans le journal des applications de Windows (ce qui n'est pas obligatoire). Elles seront intrégrées à ton exe si tu les inclus au projet (optionnel).

    Sinon les erreurs sont surement dues à l'inclusion du header NTService.h

    Dans l'exemple posté, il faut que NTService.h soit dans un répertoire connue de VC2005 (utilisation de <>). Sinon mets les fichiers du repertoire lib de ma librarie dans le même repertoire que ton sourcre principal et inclus le par "NTservices.h"....

    Tu peux assui voir les projets inclus dans la lib.

    Peux tu poster tes erreurs ?

    Pour infos, avant de poster ce code, je l'ai compilé et testé....
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  9. #9
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    NTService.cpp ???

    mes sources sont des *.c pas des *.cpp

    Tu trouveras ci dessous un projet C++ VS2005 complet et fonctionnel (testé et compilé) avec le code exemple posté précédemment....
    Fichiers attachés Fichiers attachés
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 88
    Points : 53
    Points
    53
    Par défaut
    Un grand grand merci !

    Celà fonctionne très bien.
    T'as solution clef en main et parfaite !
    Ca m'arrange bien d'autant qu'avec VS,j'ai un peu de mal.

    Félicitation et merci encore vicenzo !
    (J'ai pu remarqué que juillet fut un très bon mois car il marque ton inscription sur ce forum. Quel bonheur !!Donc bienvenue et merci ! )

  11. #11
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Cool que cela a pu t'aider !

    PS : pense à mettre le flag "résolu" sur la discussion !

    Bon courage.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 88
    Points : 53
    Points
    53
    Par défaut
    J'ai mis résolu mais ce matin j'ai eu une mauvaise surprise...

    http://www.developpez.net/forums/sho...d.php?t=416873

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WinService][C#] Comment déployer un service windows ?
    Par sokette dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/04/2005, 16h38
  2. Planifier le démarrage d'un service Window
    Par tscoops dans le forum Windows XP
    Réponses: 2
    Dernier message: 29/03/2005, 14h56
  3. [WD7.5] Service Windows
    Par cqfd dans le forum WinDev
    Réponses: 1
    Dernier message: 29/03/2005, 08h58
  4. [VB6]Arreter un service windows
    Par bouboussjunior dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 04/10/2004, 17h03
  5. [C#] Icône, barre des tâches et Service Windows
    Par SErhio dans le forum Windows Forms
    Réponses: 17
    Dernier message: 03/09/2004, 12h56

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