GESTION BASE DE REGISTRE (LOCAL OU DISTANTE)AVEC DES FONCTIONS API(NEW)

Signaler
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
excrt
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/37903-gestion-base-de-registre-local-ou-distante-avec-des-fonctions-api-new

excrt
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

#include <windows.h> // ...
#include // std::cout
#include <string> // std::string
#include <sstream> // std::stringstream

// PCSTR >> const char*
std::string GetValueData(HKEY hkTopKey, PCSTR pSubKey, PCSTR pValueName)
{
HKEY hkKey;
DWORD dwType;
DWORD dwDataSize = cstMaxRegLength;
BYTE* pData;
std::string strBuffer;
std::stringstream strStream;

if (RegOpenKeyExA(hkTopKey, pSubKey, 0, KEY_READ, &hkKey) == ERROR_SUCCESS)
{
pData = new BYTE[cstMaxRegLength + 1];

if (RegQueryValueExA(hkKey, pValueName, NULL, &dwType, pData, &dwDataSize) == ERROR_SUCCESS)
{
switch (dwType)
{
case REG_BINARY:
strStream << (UINT)pData[0] << (CHAR)'.' <<\
(UINT)pData[1] << (CHAR)'.' <<\
(UINT)pData[2] << (CHAR)'.' <<\
(UINT)pData[3];
break;

case REG_DWORD:
strStream << *(DWORD*)pData;
break;

default: dwDataSize = 0;
// !break

case REG_EXPAND_SZ:
case REG_MULTI_SZ:
case REG_SZ:
pData[dwDataSize] = '\0'; // simple précaution
strStream << (PCSTR)pData;
break;
}
strBuffer = strStream.str();
}
delete [] pData; // libère la mémoire
RegCloseKey(hkKey);
}
return strBuffer;
}

int main()
{
std::string retval = GetValueData(..., ..., ...);

std::cout << retval << std::endl;
return 0;
}
excrt
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

dernière petite chose pour aujourd'hui
dans « GetValueData() » tu as oublié de libérer la mémoire alloué pour lpData

« delete [] lpData; » avant de quitter la fonction(GetValueData)
excrt
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

en passant:
« cout << GetValueData(hkKey,"SOFTWARE\\Microsoft\\DirectX","Version") << endl; »

ton GetValueData() retourne un pointeur sur un char* que tu as alloué
récupère la valeur de GetValueData() et _ensuite_, affiche la

char* ptr = GetValueData( ... );
cout << ptr << endl;
delete [] ptr;

sinon tu vas avoir des fuites de mémoire _partout_ !

dans ton GetValueData(), petit truc:

// ...
char * rValue = new char[cstMaxRegLength];
rValue[0] = '\0'; // place ca ici(valeur par défaut, si on veut), comme ca tu sauve beaucoup de « else/default/... »
// ..

la répétition de code c'est pas très bon ...
excrt
Messages postés
75
Date d'inscription
mercredi 5 avril 2006
Statut
Membre
Dernière intervention
3 juillet 2006

« Rem:Compilation avec Borland C++ 5.5 (pas d'erreur de compil). »

une compilation sans erreur ne veut strictement _rien_ dire ...
tu peux très bien avoir « 0 error(s), 0 warning(s) » lors de la compilation
et obtenir un soft _complètement_ disfonctionnel!