Précédent   Forum du club des développeurs et IT Pro > Systèmes > Windows > Vos contributions
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/09/2007, 19h27   #1
Vincent Rogier
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 366
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 35

Informations forums :
Inscription : juillet 2007
Messages : 2 366
Points : 4 881
Points : 4 881
Par défaut [Source] [C] Librairie d'encapsulation de Services Windows

Bonjour,

Cette librairie est une encapsulation complète de l'API de services Microsoft Windows NT (NT4, 2k, XP and Vista).

Télechargement sur SourceForge.net : WinServices Library

Sommaire
  1. Description
  2. Implémentation de service
  3. Contrôle et gestion des services
  4. Contact
1. Description
  • Implémentation de service
    • Implémentation minimale : 1 SEULE fonction applicative à fournir
    • Encapsulation quasi complète de l'API windows de services
    • Full customization par une fonction unique de callback
    • Embeddable dans une Dll
    • Full logging support (via Windows events logs)
    • Convertit toute application C/C++ en service Windows NT
  • Contrôle de services
    • Installation, modification, suppression
    • Start, stop, pause, redémarrage de service
    • Vérification du status d'un service
    • Listage de services
    • Informations complètes sur un service
    • Gestion des dépendances
    • Gestions des services sur des machines distantes
  • Divers
    • Support ansi / unicode
    • version 1.5 en GPL
2. Implémentation de service

Pour implémenter un service, il suffit juste de fournir une seule fonction de traitement !

Exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <NTService.h>

void WINAPI MyServiceMain()
{
    while (!ServiceIsTerminated())
    {
        if (ServiceGetCurrentStatus() == SERVICE_RUNNING)
        {
            /* code application ... */    
        }
        ServiceSleep(1000);            
    }
}

int main(int argc, char** argv)
{
    return ServiceRun("MyServiceName", MyServiceMain, 1000, SERVICE_ACCEPT_STOP);
}
Pour plus de contrôle et/ou information sur le service et ses évènements, il est possible de fournir une fonction callback.

Exemple :
Code :
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
DWORD WINAPI MyServiceCallback(DWORD dwEvent, DWORD dwState)
{
    switch (dwEvent)
    {
        case SE_INSTALL: 
            if (dwState == SS_SUCCESS)
                ServiceLog(EVENTLOG_INFORMATION_TYPE, _T("Installation ok"));
            break;
        case SE_DELETE: 
            if (dwState == SS_SUCCESS)
                ServiceLog(EVENTLOG_INFORMATION_TYPE, _T("Uninstallation ok"));
            break;
        case SE_START: 
            /*...*/
            break;
        case SE_STOP: 
            /*...*/
            break;
        case SE_PAUSE:
            /*...*/
            break;
        case SE_CONTINUE:
            /*...*/
            break;
        case SE_CUSTOM: 
            return ServiceLog(EVENTLOG_INFORMATION_TYPE,  _T("Event %s - Status %s"), dwEvent, dwState);
    }

    return SS_SUCCESS;
}
Pour utiliser le logging par défaut dans le journal système de windows, il faut inclure à votre projet les fichiers NTEventLog.xxx fournis.

Sinon pour une gestion de logging personnalisée ou déja existante via des ressources stockées dans une DLL, il faut fournir sa propre dll et fournir les fichier de messages (*.mc, *.rc, *.h, ...). Cela est intéréssant uniquement quand il faut pouvoir gérer des messages en plusieurs langues.

3. Contrôle et gestion des services

La librarie fournie toute les fonctions nécessaires pour contrôler des services en local ou distants.

Exemple pour lister les services en local :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
LPSERVICE_ITEM list = LocalServiceGetList(SERVICE_WIN32, SERVICE_STATE_ALL, &count);

for (i = 0; i < count; i++) 
{
    printf("%s\n", list[i].lpDisplayName);
    printf("%s\n", list[i].lpServiceName);

    LPSERVICE_INFO info = LocalServiceGetInfo(list[i].lpServiceName);
    
    if (info)
    {
        printf("%s\n", info->lpBinaryPathName);
        printf("%s\n", info->lpDescription);
        printf("%s\n", info->lpServiceStartName);

        ServiceFreePointer(info);
    }
}
Voir la librairie pour toute les fonctions disponibles

4. Contact

La librairie est livrée avec des projets de test (VC6++, VS2005).

Pour toute remarque, commentaire, bug, contactez moi :

Un message sur developpez.com ou sur sourceforge.net ou à vicenzo

Have fun !!!
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 10h49   #2
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 056
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 056
Points : 865
Points : 865
Un grand projet je dirai même plus un grand projet !

Bon, je viens de tomber sur ce thread donc je vais tester le code et envoyer mes commentaires après !!
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2007, 14h35   #3
Vincent Rogier
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 366
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 35

Informations forums :
Inscription : juillet 2007
Messages : 2 366
Points : 4 881
Points : 4 881
Randriano,

L'archive n'était pas à jour..... J'ai édité le post et tu peux récupérer la bonne archive sur le lien du post (sur sourceforge.net) :

Télechargement sur SourceForge.net : WinServices Library
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/10/2007, 07h53   #4
randriano
Membre émérite
 
Avatar de randriano
 
Homme Rija Randriano
Inscription : janvier 2007
Messages : 1 056
Détails du profil
Informations personnelles :
Nom : Homme Rija Randriano
Localisation : Madagascar

Informations forums :
Inscription : janvier 2007
Messages : 1 056
Points : 865
Points : 865
D'un premier coup d'oeil, c'est géant car moi je n'arriverai pas à faire pareil! Bravo !

Permettez moi de lire ton code à présent pour apprendre plus, je reviendrai àprès sur ce thread !
Have fun too !
__________________
randriano.dvp.com
randriano est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 16h11.


 
 
 
 
Partenaires

Hébergement Web