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
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
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)
End Sub
OnStop() qui permet d'arrêter le service
Protected Overrides Sub OnStop()
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
Jevent.CreateEventSource("ServiceMemoire", "JrnlMemoire")
End If
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
If MemoireCritique () = True Then
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)
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)
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
|