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