Service Windows qui ne veut pas démarrer [Résolu]

Messages postés
16
Date d'inscription
vendredi 28 novembre 2008
Dernière intervention
28 juin 2011
- - Dernière réponse : nhervagault
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
- 29 avril 2010 à 21:58
Bonsoir tout le monde,
Je suis débutante en C# et je suis confrontée à un souci qui, je l'espère, n'est pas de taille !!
En fait je dois créer un service Windows qui doit bloquer des processus (des applications en gros).

Pour ça, j'ai déjà un code en vb.net, qui fonctionne. Ce code est constitué d'une BDD Access qui contient une table avec un identifiant et un champ contenant le nom du processus, une DLL et le service Windows.

J'ai réussi à générer la dll et le service Windows. Le seul hic est que le service ne veut pas démarrer ! Et je ne sais pas d'où vient le souci, mais alors vraiment pas du tout, et je suis sur ce problème depuis ce matin, 8h30...
Je vous expose mes fichiers.cs :
Idata et CLdata, les fichiers de ma dll
Idata.cs, mon interface
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LIB_data
{
    //Création de l'interface
    public interface Idata
    {
        /*string IfileTYPE
        {
            get;
        }*/
        string IfileDB
        {
            get;
        }
        System.Data.DataSet getExE();
    }
}


CLdata, ma classe
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Data.OleDb;

namespace LIB_data
{
    public class CLdata : Idata
    {
        #region Private Members
            private System.IO.StreamReader oSR;
            private IDbConnection oCNX;
            private IDbCommand oCMD;
            private IDbDataAdapter oDA;
            private System.Data.DataSet oDS;
            private string R_sql;
            //private string DBTYPE;
            //private string SQLSERVER = "MSSQLSERVER";
            //private string MSACCESS = "MSACCESS";
        #endregion

        #region Interface CLdata
        public CLdata()
        {
            this.R_sql = "SELECT * FROM TB_INTERDIT";
            /*this.oSR = new System.IO.StreamReader(((Idata)this).IfileTYPE);
            this.DBTYPE = this.oSR.ReadToEnd();*/
            // C'est ici que le coté générique de notre classe prend forme
            //if ((this.DBTYPE == this.MSACCESS))
            {
                this.oSR = new System.IO.StreamReader(((Idata)this).IfileDB);
                this.oCNX = new System.Data.OleDb.OleDbConnection(this.oSR.ReadLine());
                this.oCMD = new System.Data.OleDb.OleDbCommand();
                this.oDA = new System.Data.OleDb.OleDbDataAdapter();
            }
            /*if ((this.DBTYPE == this.SQLSERVER))
            {
                this.oSR = new System.IO.StreamReader(((Idata)this).IfileDB);
                this.oCNX = new System.Data.SqlClient.SqlConnection(this.oSR.ReadLine());
                this.oCMD = new System.Data.SqlClient.SqlCommand();
                this.oDA = new System.Data.SqlClient.SqlDataAdapter();
            }*/
            {
                this.oCMD.CommandText = this.R_sql;
                this.oCMD.CommandType = CommandType.Text;
                this.oCMD.Connection = this.oCNX;
            }
            {
                this.oDA.SelectCommand = this.oCMD;
            }
            this.oDS = new System.Data.DataSet();
        }

        #endregion

        #region Idata Members
        string LIB_data.Idata.IfileDB
        {
            get
            {
                return "C:\\Users\\Annabelle\\Desktop\\Projet Archi.net\\Test des tutos sur les services windows\\LIB_data\\data\\connectionString.dat";
            }
        }

        /*string LIB_data.Idata.IfileTYPE
        {
            get
            {
                return "C:\\Users\\Annabelle\\Desktop\\Projet Archi.net\\Test des tutos sur les services windows\\LIB_data\\data\\typeDB.dat";
            }
        }*/
        #endregion

        #region Function of Idata
        System.Data.DataSet Idata.getExE()
        {
            this.oCMD.CommandText = this.R_sql;
            this.oDA.Fill(this.oDS);
            return this.oDS;
        }
        #endregion
    }
}


Service1.cs, le code de mon service windows (à côté j'ai un projectinstaller et un eventlog, mais on s'en moque pour le coup)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace Service_windows
{
    public partial class Service1 : ServiceBase
    {

        private int i;
        private LIB_data.Idata oDATA;
        private System.Data.DataSet oDS;
        private Process[] all_process = new Process[11];
        private Process process;
        private string PROCCESS_NAME;
        private int count_proccess_interdit;
        private short countPassage;
        private System.Timers.Timer tim = new System.Timers.Timer(5000);

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            tim.Elapsed += mvTimer_Elapsed;
            this.i = 0;
            this.countPassage = 0;
            this.oDATA = new LIB_data.CLdata();
            this.oDS = this.oDATA.getExE();
            this.count_proccess_interdit = this.oDS.Tables[0].Rows.Count;
            this.tim.Enabled = true;
            this.evt_interdit.WriteEntry("Service Windows démarré");
        }

        protected override void OnStop()
        {
        }

        protected override void OnPause()
        {
            base.OnPause();
            this.evt_interdit.WriteEntry("Service Windows en pause");
        }

        private void mvTimer_Elapsed(object pSender, System.Timers.ElapsedEventArgs ByValpArgs)
        {
            this.PROCCESS_NAME = this.oDS.Tables[0].Rows[i].ItemArray[1].ToString();
            this.all_process = System.Diagnostics.Process.GetProcessesByName(PROCCESS_NAME);
            if (all_process.Length > 0)
            {
                this.process = all_process[0];
                this.process.Kill();
            }
            this.i += 1;
            if (this.i == this.count_proccess_interdit)
            {
                i = 0;
            }
            this.countPassage += 1;
            if (this.countPassage == 10)
            {
                this.countPassage = 0;
                GC.Collect();
            }
        }

    }
}


Voilà !
Je ne demande pas à ce que l'on me demande la réponse sur un plateau d'argent (sauf si vous l'avez :D) mais au moins si vous avez des pistes de solution !!
Je précise que je n'ai pas le choix sur les technologies utilisées (dll, service windows et access) et aussi que je suis desespérée

Merci d'avance !!
Annabelle
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
16
Date d'inscription
vendredi 28 novembre 2008
Dernière intervention
28 juin 2011
3
Merci
C'est bon problème résolu, le code est tout à fait fonctionnel
En fait le souci venait de.... l'eventlog, j'avais oublié de renseigner la source.
Je ne sais pas pourquoi mais du coup le service ne voulait pas démarrer.
Mais le service fonctionne correctement c'est l'essentiel

Je suis contente

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 121 internautes nous ont dit merci ce mois-ci

Commenter la réponse de 0nn2belle
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
23
0
Merci
Salut,

Peux-tu mettre des commentaires pour comprendre ton code?

Et faire l'algo sur un papier, il me semble que ton algo n'est pas correct.

Pour débugger, il faut s'abonner aux processus.
Ou essayer de faire une application windows sinon, pour détecter ce qui ne va pas?

Enleve le GC.collect, ca doit bouffer en ressource (toutes les 5 sencondes, c'est beaucoup)

Si je comprends, le truc si tu as 10 applications interdites il faut 50 secondes pour les parcourir.

Proposition (algo rapide)
Faire un list<String>
if list.contains(processname)
{
process.kill();
}



Il y a possibilité de s'abonner sur du WMI pour
faire ce traitement aussi.

http://www.codeproject.com/KB/system/win32processusingwmi.aspx
Commenter la réponse de nhervagault

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.