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

C++ Discussion :

[Base Registre] Liste des logiciels installés


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut [Base Registre] Liste des logiciels installés
    Bonjour

    J'ai comme projet de BTS le développement d'une application de gestion de parc informatique. Je m'explique : le programme doit être capable de lister les logiciels installés sur la machine, son matériel, et d'envoyer le tout à une base de donnée (cette opération s'effectuant à chaque premier démarrage de la machine, soit une fois/jour).

    M'occupant de la version Windows, j'utilise donc la base de registre pour récupérer ces informations. Et étant donné que je trouve l'API Microsoft très peu pratique, je me suis dis qu'ils serait bon de développer une classe qui s'occuperait de gérer les relations avec la base de registre, histoire de lever un gros poids pour la suite


    Je vous met ci-dessous mes 3 fichiers (le main, et la classe) et vous détaillerais mon problème à la suite.

    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
     
    #ifndef H_BASEREGISTRE
    #define H_BASEREGISTRE
     
    #include <Windows.h>
    #include <string>
     
    class BaseRegistre
    {
    	public:
    		BaseRegistre(); // Constructeur par défaut
    		BaseRegistre(	// Constructeur utilisateur avec valeurs par défaut
                            HKEY repertoireBase,
                            const char *sousRepertoire,
                            REGSAM mode
                        );
     
    		~BaseRegistre();
     
                // Accesseurs
    		int getNbLogiciels();
    		std::string getLogiciels(int i);
     
     
    	private:
    		HKEY m_key; // Handle (id) de connexion à la base de registre
    		HKEY m_repertoireBase;
    		const char *m_sousRepertoire;
    		REGSAM m_mode;
    		DWORD m_keySize; //Taille de la donnée récupérée
    		DWORD m_keysNumbers; // Nombre de clés dans le répertoire courant
    		char m_softName[512]; // Nom du logiciel
    		int m_nombreLogiciels; // Nombre de logiciels installés
    		std::string *m_tabLogiciels;
     
                // Fonctions internes à la classe
    		void compterLogiciels();
    		void listerLogiciels();
    };
     
    #endif
    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
     
    #include "BaseRegistre.h"
     
     
    BaseRegistre::BaseRegistre() // Constructeur par defaut
    {
        m_repertoireBase = HKEY_LOCAL_MACHINE;
        m_sousRepertoire = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
        m_mode = KEY_READ;
     
        RegOpenKeyEx(
            m_repertoireBase, // Nom de la branche principale
            m_sousRepertoire, // Nom du sous-répertoire
            0, // Réservé
            m_mode, // Seulement en lecture
            &m_key // Handle sur la base
        );
    }
     
     
    BaseRegistre::BaseRegistre(	// Constructeur utilisateur avec valeurs par défaut
        HKEY repertoireBase=HKEY_LOCAL_MACHINE,
        const char *sousRepertoire="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
        REGSAM mode=KEY_READ
    )
    {
        m_repertoireBase = repertoireBase;
        m_sousRepertoire = sousRepertoire;
        m_mode = mode;
     
        RegOpenKeyEx(
            m_repertoireBase, // Nom de la branche principale
            m_sousRepertoire, // Nom du sous-répertoire
            0, // Réservé
            m_mode, // Seulement en lecture
            &m_key // Handle sur la base
        );
    }
     
     
    BaseRegistre::~BaseRegistre()
    {
        delete[] m_tabLogiciels; // On libère la mémoire
        RegCloseKey(m_key); // On ferme l'accès à la base de registre
    }
     
     
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////   FONCTIONS INTERNES   //////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
    void BaseRegistre::compterLogiciels() // Compte le nombre de logiciels installés sur la machine
    {
        RegQueryInfoKey(m_key, NULL, 0, NULL, &m_keysNumbers, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
        m_nombreLogiciels = static_cast<int>(m_keysNumbers);
    }
     
     
    void BaseRegistre::listerLogiciels() // Liste les nom des applications installées
    {
        DWORD j=0;
        compterLogiciels();
        m_tabLogiciels = new std::string[m_nombreLogiciels]; // On créé un tableau de string selon le nombre de logiciels installés
     
        for (int i=0 ; i<m_nombreLogiciels ; i++) // Boucle parcourant les dossiers pour récupérer leur nom
        {
            RegEnumKeyExA(m_key, j, m_softName, &m_keySize, NULL, NULL,  NULL, NULL);
            m_tabLogiciels[i] = m_softName;
            j++;
        }
    }
     
     
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////   ACCESSEURS   //////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
     
    int BaseRegistre::getNbLogiciels()
    {
        listerLogiciels();
        return m_nombreLogiciels;
    }
     
     
    std::string BaseRegistre::getLogiciels(int i)
    {
        if (i > m_nombreLogiciels)
            return 0;
     
        else
            return m_tabLogiciels[i];
    }
    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
     
    #include <iostream>
    #include "BaseRegistre.h"
     
    using namespace std;
     
     
    int main()
    {
    	BaseRegistre winReg;
    	int nbLog;
     
    	nbLog = winReg.getNbLogiciels();
    	cout << "Nombre de logiciels installés : " << nbLog << endl;
     
        for(int i=0 ; i<nbLog ; i++)
            cout << "Nom du logiciels " << i << " : " << winReg.getLogiciels(i) << endl;
     
    	return 0;
    }
    Le problème :
    J'arrive très bien à récupérer le nombre de logiciels installés (maj comprises pour le moment).
    Par contre, quand je souhaite récupérer leur nom, là ça foire un peu... :-°

    En fait, il ne me récupère le nom que de trois programmes. Je me retrouve alors avec une liste du genre :
    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
     
    Nombre de logiciels installÚs : 124
    Nom du logiciels 0 : 7-Zip
    Nom du logiciels 1 : 7-Zip
    ...
    Nom du logiciels 6 : 7-Zip
    Nom du logiciels 7 : 7-Zip
    Nom du logiciels 8 : 7-Zip
    Nom du logiciels 9 : 7-Zip
    Nom du logiciels 10 : 7-Zip
    Nom du logiciels 11 : IE40
    Nom du logiciels 12 : IE40
    Nom du logiciels 13 : IE40
    Nom du logiciels 14 : IE40
    Nom du logiciels 15 : IE40
    Nom du logiciels 16 : IE40
    Nom du logiciels 17 : IE40
    Nom du logiciels 18 : IE40
    ...
    Nom du logiciels 30 : IE40
    Nom du logiciels 31 : IE40
    Nom du logiciels 32 : IE40
    Nom du logiciels 33 : IE40
    Nom du logiciels 34 : WIC
    Nom du logiciels 35 : WIC
    ...
     
    Process returned 0 (0x0)   execution time : 0.104 s
    Press any key to continue.
    Je pense que le problème vient de ma boucle récupérant les noms, mais je ne vois pas vraiment où . Une idée ?

    Merci d'avance, et désolé pour la longueur du post mais je préfère être clair et fournir un max d'infos pour trouver une solution

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    C'est ici le pb : RegEnumKeyExA(m_key, j, m_softName, &m_keySize

    le 4eme paramètre est in et out.

    En entrée il contient la taille du buffer et en sortie le nombre de caractères retournés ou la taille nécessaire en cas d'erreur. Il faut le renseigner avant de lire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m_keySize = sizeof(m_softName);
    RegEnumKeyExA(m_key, j, m_softName, &m_keySize, ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Invité
    Invité(e)
    Par défaut
    Impeccable, merci beaucoup
    Je vais relire la définition de la fonction, histoire de bien comprendre mon erreur. J'ai sûrement sauté quelques mots lors de la première lecture

    Encore merci !

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

Discussions similaires

  1. Place la liste des logiciels installés dans une feuille Excel
    Par ESVBA dans le forum Vos Contributions VBScript
    Réponses: 3
    Dernier message: 17/07/2011, 11h13
  2. Réponses: 18
    Dernier message: 17/01/2008, 12h54
  3. Réponses: 5
    Dernier message: 10/07/2006, 19h11
  4. Liste des logiciels installés
    Par Civodul4 dans le forum Windows
    Réponses: 4
    Dernier message: 06/10/2004, 15h51
  5. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 18h41

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