Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS .NET FAQs .NET TUTORIELS .NET SOURCES .NET LIVRES .NET OUTILS .NET BLOG .NET DOTNET TV

Création d'une application de type Service Windows

Date de publication : 16/03/2005 , Date de mise a jour : 16/03/2005

Par Selkis (selkis.developpez.com)
 

Dans ce tutoriel, nous allons voir comment créer un service windows, ajouter un programme d'installation, l'installer et verfier son fonctionnement.


I. Creation du service
I.A. Préparation du service
I.B. Ajout des composants necessaires
II. Ajout du programme d'installation
III. Installation et désinstallation du service
IV. Vérification du service
V. L'api GlobalMemoryStatus

Télecharger le code source commenté exemple vb.net ServiceMemoire

I. Creation du service

Un service Windows est une application de type service s'exécutant généralement en tache de fond.
L'utilisateur ne peut donc pas interagir avec lui. Il se presente sous la forme d'un executable, en grande partie gérer par windows.
Il peut être lancé automatiquement au demarrage de l'ordinateur, arreter ou redemarrer tres simplement. Ses évenements sont tres souvent inscrit dans un journal d'evenement.


But du service : Nous allons donc développer un service qui va vérifier toute les 10 secondes notre mémoire libre par l'utilisation d'un api et émettre un bip si cette dernière descend en dessous des 80%. Les événements de ce service seront enregistrer dans un journal d'événement.

Pour commencer nous allons créer un nouveau projet de type Service Windows

Creer un nouveau projet de type Service Windows
L'avantage à utiliser ce modèle est de pouvoir bénéficier par héritage de toutes les fonctionnalités de la classe ServiceBase (Fournit une classe de base pour un service qui fera partie d'une application de service).

A la création du projet VS.net va générer automatiquement le code spécifique au lien d'héritage :
Inherits System.ServiceProcess.ServiceBase et donc nous fournir deux procédures :

OnStart() qui permet d'initialiser le processus dont le traitement est effectué périodiquement grâce a un timer.

Cette procédure est activé par Windows et ne doit jamais contenir de boucles infinies
Protected Overrides Sub OnStart(ByVal args() As String) 'Ajoutez ici le code pour démarrer votre service. Cette méthode doit 'permettre à votr service de faire son travail. End Sub
OnStop() qui permet d'arrêter le service

Protected Overrides Sub OnStop() ' Ajoutez ici le code pour effectuer les destructions nécessaires à l'arrêt 'de votre service. End Sub

I.A. Préparation du service

Avant toute chose nous devons renommer notre service de Service1 en SMemoire pour nous permettre de mieux l'identifier.

puis, modifier la propriété AutoLog a true, ce qui nous permettra d'inscrire tous les événements liés au service, dans les journaux système.

Pour finir ouvrez la section #region du code,
et dans la procédure Shared Sub Main() Modifier la ligne :

ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service1}
Par :

ServicesToRun = New System.ServiceProcess.ServiceBase() {New SMemoire}

I.B. Ajout des composants necessaires

    Sur la page [desing] de SMemoire.vb, rajouter :
  • un contrôle [timer Serveur] nommé : Timer1 dont la propriété interval est défini a 10000 (10 Secondes)
  • un contrôle [EventLog] nommé : Jevent
Le control Jvent de type journal d'événement , va nous permettre d'inscrire dans un journal de log, toute sorte d'information (demmarage du service, arrêt du service, état de la mémoire).

Nous allons donc écrire le code qui va nous permettre de créer le dit journal et de lui affecter en source le nom de notre service.

Dans la procédure Public Sub New() juste en dessous de InitializeComponent() rajouter le code suivant :

'si le journal de notre application n'existe pas If Not Jevent.SourceExists("ServiceMemoire") Then 'on le Cree Jevent.CreateEventSource("ServiceMemoire", "JrnlMemoire") End If 'et on lui indique la source de la création Jevent.Source = "ServiceMemoire"
  • La fonction SourceExists membre de System.Diagnostics.EventLog Détermine si une source d'événements est inscrite dans l'ordinateur local et prend en paramètre le nom de la source d'événement. Elle retourne vrai si la source est inscrite.
  • La méthode CreateEventSource membre de System.Diagnostics.EventLog Crée un nouveau journal personnalisé sur l'ordinateur local. Elle attend en paramètre le nom de la source grâce à laquelle l'application est inscrite dans l'ordinateur et le nom du journal dans lequel les entrées de la source seront écrites.
  • La propriété Source est de type string ,elle permet d'obtenir ou de définir le nom de la source à inscrire et à utiliser lors de l'écriture d'entrées dans le journal des événements.
Le control Timer1 va nous permettre grâce a l'événement Elapsed (déclenché en fonction de l'intervalle défini), de lancer la procédure de notre service (dans notre cas, émettre un bip et récupérer la mémoire libre).

il est déclanché ou arrêter par les procédures OnStart() ou OnStop()

Nous allons donc profiter de ces procédures pour inscrire un événement à chaque démarrage et à chaque arrêt du service tout en déclanchant ou en arrêtant notre Timer .

Pour ce faire, modifier les procédures OnStart() et OnStop() comme ci-dessous

Protected Overrides Sub OnStart(ByVal args() As String) Jevent.WriteEntry("démarrage du service") Timer1.Enabled = True End Sub Protected Overrides Sub OnStop() Jevent.WriteEntry("Arrêt du service") Timer1.Enabled = False End Sub
Modifier ensuite l'événement Elapsed de notre timer pour qu'il nous récupère les infos concernant notre mémoire.

Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed 'si l'etat de notre memoire est critique alors If MemoireCritique () = True Then 'on emet un bip et on inscrit dans le journal l'état de notre mémoire libre Beep() Jevent.WriteEntry(Str(MemLibre) & "%") End If
Votre service est créer, vous pouvez maintenant le compiler

Pour voir l'api et la fonction retournant l'état de notre mémoire, reportez vous en fin d'article.

II. Ajout du programme d'installation

Un service Windows est une application de type service s'exécutant généralement en tache de fond.
C'est donc un exécutable dont l'exécution est assuré en grande partie par Windows.
Pour que Windows puisse l'exécuter, il doit être installé, c'est ce que nous allons voir dans ce cours.

Activer la fenêtre de conception SMemoire.vb [Desing] puis cliquer sur F4 pour activer sa fenêtre des propriétés. Au bas de la fenêtre cliquez sur le lien " Ajouter le programme d'installation " , qui va nous permettre de définir les actions liées à l'installation de notre service. Deux composant sont alors créer, l'un pour les paramètres de l'installation du processus, l'autre pour les paramètres liés a l'installation du service.

    Dans les propriétés du ServiceInstaller1, il faut vérifier :
  • la propriété ServiceName qui doit se nommer Smemoire (le nom du service a installer)
  • la propriété StartType qui doit être en Automatique (le type de démarrage)
    Dans les propriété du ServiceProcessInstaller1 verifier :
  • la propriété Account qui doit être sur LocalSystem
Ouvrez les propriété de votre projet (projet --> propriété de Smemoire), dans Objet de démarrage et sélectionner SMemoire.
Vous pouvez maintenant générer et sauvegarder votre projet, vous vous retrouver avec un fichier ServiceMemoire.exe dans le répertoire bin de votre projet.


III. Installation et désinstallation du service

La création de notre service est réalisé, il ne nous reste plus qu'a le faire prendre en compte par le système d'exploitation en l'installant.
C'est tres simple a réaliser, positionnez vous avec votre explorateur dans le répertoire c:\Windows\Micorsoft.net\Framework\v1.0.xxxx (xxxx represente la version de votre Framework) et lancer le fichier InstallUtil.exe , cela va vous ouvir une fenetre de commande, il ne vous reste plus qu'a taper :

InstallUtil " C:\projets\ServiceMemoire\bin\ServiceMemoire.exe "
Le service va s'installer automatiquement.

Pour desinstaller le programme il suffira de refaire la même procedure mais de taper :
InstallUtil /u " C:\projets\ServiceMemoire\bin\ServiceMemoire.exe "



IV. Vérification du service

Pour verifier que notre service soit bien installé, il suffit d'ouvir la console de management des Services de Windows et regarder que notre service est bien present.
Pour ce faire, Cliquer sur demarrer --> panneau de configuration --> Outils d'administration --> Services , puis rechercher votre service (SMemoire)

Vous devez voir ceci :

Notre service est bien présent, l'installation c'est dérouler correctement, nous allons maintenant tester le service en lui meme.

Avant touche chose n'oubliez pas de démarrer votre service.
Nous allons ensuite consommer volontairement de la memoire (ouvrez simplement plusieurs applications), et lorque le seuil de memoire critique defini par service sera atteint, l'ordinateur emettra un beep et ira inscrire dans le journal d'evenement du service l'etat de notre memoire libre. Il nous suffira de lire ce journal pour voir si les evenements ont bien été inscrit.

Pour lire le journal, il faut une fois de plus ouvrir la console de management Windows, mais cette fois ci, celle des Observateur d'événements.
Cliquer sur demarrer --> panneau de configuration --> Outils d'administration --> Observateur d'événements

Vous devez apercevoir ceci :

Vous pouvez vous servir des services windows, pour tout type de surveillance, s'exectuant sur de longue periode s'executant sur leur propre sessions.

V. L'api GlobalMemoryStatus

nous permet de récupérer sous forme de structure toute sorte d'information concernant l'état de notre mémoire.
Il se declare de la façon suivante :

Declare Sub GlobalMemoryStatus Lib "kernel32" (ByRef lpBuffer As MEMORYSTATUS) 'La structure : Structure MEMORYSTATUS Dim dwLength As Integer Dim dwMemoryLoad As Integer Dim dwTotalPhys As Integer Dim dwAvailPhys As Integer Dim dwTotalPageFile As Integer Dim dwAvailPageFile As Integer Dim dwTotalVirtual As Integer Dim dwAvailVirtual As Integer End Structure
La fonction MemoireCritique()
Private Function MemoireCritique() As Boolean Dim Memoire As MEMORYSTATUS GlobalMemoryStatus(Memoire) MemLibre = Int((Memoire.dwAvailPhys / Memoire.dwTotalPhys) * 100) If MemLibre < 80 Then Return True Else Return False End If End Function
Pour en savoir plus sur les services windows vous pouvez consultez :
 Applications de service Windows sur le site de Msdn

Télecharger le code source commenté exemple vb.net ServiceMemoire

Liste de mes articles Vb.Net:
Accueil de la section VB.NET.
Utilisation d'une base Access en mode déconnecté avec Ado.Net.
Lecture et ecriture d'un fichier Xml à schéma connu.
Création d'une application de type Service Windows.
Création d'un logo xara3d en utilisant un service webdistant


Copyright © 2005 selkis. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Responsables bénévoles de la rubrique DotNET : Jérôme Lambert et Louis-Guillaume Morand - Contacter par EMail :
Vos questions techniques : forum d'entraide DotNET - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.