Soyez le premier à donner votre avis sur cette source.
Snippet vu 10 387 fois - Téléchargée 26 fois
//---------------------------------------------------------------------------- // Designation : Gestion base de registre // Auteur : UKR6900 // Date : 01/06/2006 // Date dernier MAJ : 03/06/2006 // D'après le Prg de : //---------------------------------------------------------------------------- #include <stdio> #include <stdlib> #include <windows> #include <ostream> const int cstMaxRegLength = 1024; //------------------------------------------------------------------------------ // FONCTION : QuesryKey // DESCRIPTION : Permet de lire la valeur d'une clé de regsitre //------------------------------------------------------------------------------- string GetValueData(HKEY hkTopKey, string lpSubKey, string lpValueName){ HKEY hkKey; DWORD lpType, dwDataSize = cstMaxRegLength; //Receptionne la valeur de réception lecture clé registre unsigned char * lpData = new unsigned char[cstMaxRegLength]; //Receptionne la valeur de réception lecture clé registre char * rValue = new char[cstMaxRegLength]; rValue[0] = '\0'; //Lecture de la clé registre si ok passe à la suite... if (RegOpenKeyEx(hkTopKey,lpSubKey.c_str(),0,KEY_READ,&hkKey) == ERROR_SUCCESS){ if (RegQueryValueEx(hkKey,lpValueName.c_str(),NULL,&lpType,lpData,&dwDataSize) == ERROR_SUCCESS){ //déchiffrage des différents type de clé dans registry switch ((int)lpType){ case REG_BINARY: itoa((u_int)(lpData[0]),rValue, 10); strcat(rValue,"."); itoa((u_int)(lpData[1]),(char*)(rValue+strlen(rValue)),10); strcat(rValue,"."); itoa((u_int)(lpData[2]),(char*)(rValue+strlen(rValue)),10); strcat(rValue,"."); itoa((u_int)(lpData[3]),(char*)(rValue+strlen(rValue)),10); break; case REG_DWORD: itoa(*(int*)(lpData),rValue,10); break; case REG_EXPAND_SZ: rValue=(char *)lpData; break; case REG_MULTI_SZ: rValue=(char *)lpData; break; case REG_SZ: rValue=(char *)lpData; break; }//end switch }//end if RegCloseKey(hkKey); }//end if return rValue; }//end function //------------------------------------------------------------------------------ // FONCTION : CreateKey // DESCRIPTION : Permet de creer une cle, une valeur et de modifier une valeur //------------------------------------------------------------------------------- long CreateKey(HKEY hkTopKey,const char *lpSubKey,const char *lpClass,const char *lpData){ HKEY keyHandle; DWORD lpdw; //Afin de placer la valeur vous devez indiquer la longueur du lpData. int aLen = strlen(lpData) + 1; //Ceci créera la clef si elle n'existe pas ou ne la met pas à jour s'il elle existe. if ( RegCreateKeyEx(hkTopKey,lpSubKey,0,"Anything",REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,&keyHandle,&lpdw)== ERROR_SUCCESS){ //Ceci écrira les données à la clef nouvellement créée ou les mettra à jour. long rtn=RegSetValueEx(keyHandle,lpClass,0,REG_SZ,(LPBYTE)lpData,aLen); //il faut fermer la cle de registre RegCloseKey(keyHandle); return rtn; }//end if //ferme le canal de communication (handle) RegCloseKey(hkTopKey); return 1; }//end function //--------------------------------------------------------------------------------- // FONCTION : DeleteKey // DESCRIPTION : Permet de supprimer une cle et les valeurs contenues dans la cle //---------------------------------------------------------------------------------- long DeleteKey(HKEY hkTopKey,char *clpPathKey){ HKEY hkKey; //Verifie si la cle specifiee existe if (RegOpenKeyEx(hkTopKey,clpPathKey,0,KEY_READ|KEY_WRITE,&hkKey) == ERROR_SUCCESS){ //Efface la cle long rtn=RegDeleteKey(hkTopKey,clpPathKey); RegCloseKey(hkTopKey); return rtn; }//end if //ferme le canal de communication (handle) RegCloseKey(hkTopKey); return 1; }//end function //------------------------------------------------------------------------------ // START PROGRAM //------------------------------------------------------------------------------- int main(){ string NomPc; //Si le pc est locale string Valeur; //Récupére la valeur de la clé // string NomPc = "\\\\PC050001494"; //Si le pc est distant int error = 0; HKEY hkKey; //------------------------------------------------------------- //Connection à distance sur le pc Remote ou locale if (RegConnectRegistry(NomPc.c_str(),HKEY_LOCAL_MACHINE,&hkKey) != ERROR_SUCCESS){ printf("Ordinateur %s non trouvé\n", NomPc); error = 2; }else { Valeur = GetValueData(hkKey,"SOFTWARE\\Microsoft\\Internet Connection Wizard","InstallationDirectory"); cout << Valeur << endl; }//end if //------------------------------------------------------------- //cree une cle et une valeur dans la base de registre if (RegConnectRegistry(NomPc.c_str(),HKEY_LOCAL_MACHINE,&hkKey) != ERROR_SUCCESS){ printf("Ordinateur %s non trouvé\n", NomPc); error = 2; }else { if(CreateKey(hkKey,"Software\\Folder1","MyKey","MyValue")== ERROR_SUCCESS) cout << "création réussie" << endl; else cout << "Problème de création!" << endl; //end if }//end if //------------------------------------------------------------- //cree une cle et une valeur dans la base de registre if (RegConnectRegistry(NomPc.c_str(),HKEY_LOCAL_MACHINE,&hkKey) != ERROR_SUCCESS){ printf("Ordinateur %s non trouvé\n", NomPc); error = 2; }else { if(DeleteKey(hkKey,"Software\\Folder1")== ERROR_SUCCESS) cout << "Effacement réussie" << endl; else cout << "Problème de la suppression!" << endl; //end if }//end if //------------------------------------------------------------- return error; }//end programme //------------------------------------------------------------------------------ // END PROGRAM //-------------------------------------------------------------------------------
#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;
}
dans « GetValueData() » tu as oublié de libérer la mémoire alloué pour lpData
« delete [] lpData; » avant de quitter la fonction(GetValueData)
« 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 ...
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!
c'est ça enrichir un code au fur et mesure des besoins.
Mais celui-ci est une base importante pour une programmation
système des base de registre.(Contrôle des paramétrages Anti-virus, création des
clé pour contrôle des logs etc...)
Ce sont les fonctions qui sont importantes,pas le code qui donne un exemple d'utilisation des fonctions.
Et celui qui comprend pas l'intérêt de ce code, c'est qu'il ne travaille pas dans le bon domaine de programmation et voilà....
Moi dans le temps, j'aurai été content de trouver des exemples comme celui-ci.
A bon entendeur, A+
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.