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]; }Le problème :
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; }
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 :
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 ?
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.
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
Partager