begin process at 2012 05 27 19:00:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > LE REGISTRE FACILE (VC++ SANS MFC)

LE REGISTRE FACILE (VC++ SANS MFC)


 Information sur la source

Note :
8,57 / 10 - par 7 personnes
8,57 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Niveau :Initié Date de création :04/02/2004 Date de mise à jour :24/08/2004 01:07:14 Vu / téléchargé :10 085 / 1 269

Auteur : DeAtHCrAsH

Ecrire un message privé
Site perso
Commentaire sur cette source (12)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Voici une classe permattant une gestion quasi-totale du registre!
La plupart de celle deja presente sur le site présente des defaut, tel que la limite dans la saisie et la lecture des clés registres. Ce qui a pour effet de faire planter les prog utilisant ces classes.
Ainsi celle que je vous presente qui malgré tout n'est pas complete, ne presente plus ces limites, et en plus est en francais :p
Une gestion des erreurs a été incluse a la classe ! Pour ceux qui ne voudrait pas se servir de la gestion automatique des erreurs, une option permet de la désactiver pour une gestion personnalisée...


SheLL

Source

  • /****
  • * Class : Registre
  • * Auteur: Shell
  • * Date : 24/08/2004
  • * Commentaires : Cette page de code contient la "class" permettant l'edition de la base de registre
  • ***/
  • #include "RegistreErreur.h"
  • class Registre
  • {
  • int returnValue;
  • DWORD dwLen;
  • LPBYTE dwKeyEn;
  • HKEY ChoisirBase(char *base);
  • unsigned long ChoisirType(char *type);
  • public:
  • Registre();
  • ~Registre();
  • bool GestionErreur;
  • bool OuvrirCle(char *base, char *chemin, HKEY *hCle);
  • char *LireValeur(HKEY hCle, char *nom, bool *OpRes);
  • bool EcrireValeur(HKEY hCle, char *nom, char *valeur, char *type);
  • bool CreerCle(char *base, char *chemin, HKEY *hCle);
  • bool SupprimerCle(char *base, char *chemin);
  • bool SupprimerValeur(char *base, char *chemin, char *nom);
  • bool FermerCle(HKEY hCle);
  • };
  • Registre::Registre()
  • {
  • dwKeyEn = NULL;
  • dwLen = 0;
  • }
  • Registre::~Registre()
  • {
  • delete dwKeyEn;
  • }
  • HKEY Registre::ChoisirBase(char *base)
  • {
  • HKEY tBase=0;
  • if(strcmp(base,"HKEY_CURRENT_USER")==0)
  • tBase = HKEY_CURRENT_USER;
  • else if(strcmp(base,"HKEY_USERS")==0)
  • tBase = HKEY_USERS;
  • else if(strcmp(base,"HKEY_LOCAL_MACHINE")==0)
  • tBase = HKEY_LOCAL_MACHINE;
  • else if(strcmp(base,"HKEY_CURRENT_CONFIG")==0)
  • tBase = HKEY_CURRENT_CONFIG;
  • else if(strcmp(base,"HKEY_CLASSES_ROOT")==0)
  • tBase = HKEY_CLASSES_ROOT;
  • return tBase;
  • }
  • unsigned long Registre::ChoisirType(char *type)
  • {
  • unsigned long hResType=0;
  • if(strcmp(type,"REG_NONE")==0)
  • hResType = REG_NONE;
  • else if(strcmp(type,"REG_SZ")==0)
  • hResType = REG_SZ;
  • else if(strcmp(type,"REG_BINARY")==0)
  • hResType = REG_BINARY;
  • else if(strcmp(type,"REG_DWORD")==0)
  • hResType = REG_DWORD;
  • else if(strcmp(type,"REG_DWORD_BIG_ENDIAN")==0)
  • hResType = REG_DWORD_BIG_ENDIAN;
  • else if(strcmp(type,"REG_LINK")==0)
  • hResType = REG_LINK;
  • else if(strcmp(type,"REG_MULTI_SZ")==0)
  • hResType = REG_MULTI_SZ;
  • return hResType;
  • }
  • bool Registre::OuvrirCle(char *base, char *chemin, HKEY *hCle)
  • {
  • HKEY hTempCle=0;
  • //Ouvre la clef ou se trouve la valeur
  • returnValue = RegOpenKey(ChoisirBase(base), chemin, &hTempCle);
  • if (returnValue != ERROR_SUCCESS)
  • {
  • if(GestionErreur)
  • OnRegError(ERR_CLECHEMIN);
  • return false;
  • }
  • *hCle = hTempCle;
  • return true;
  • }
  • char *Registre::LireValeur(HKEY hCle, char *nom, bool *OpRes)
  • {
  • //On recupere la taille de la clé dans un premier temps pour connaitre la taille du buffer que l'on va devoir spécifié
  • returnValue = RegQueryValueEx(hCle, nom, NULL, NULL, NULL, &dwLen);
  • //On alloue la taille nécéssaire pour éviter les dépassement de caaciter qui risqueraient décrassé d'aure varaible de la mémoire
  • dwKeyEn = new BYTE[dwLen];
  • //Maintenant on lit la valeur de la clé en spécifiant la taille du buffer
  • returnValue = RegQueryValueEx(hCle, nom, NULL, NULL, dwKeyEn, &dwLen);
  • if(returnValue != ERROR_SUCCESS)
  • {
  • *OpRes = false;
  • if(GestionErreur)
  • OnRegError(ERR_NOM);
  • return "Erreur!";
  • }
  • *OpRes = true;
  • return (char*)dwKeyEn; //on retourne le résultat a l'aide d'un CAST
  • }
  • bool Registre::EcrireValeur(HKEY hCle, char *nom, char *valeur, char *type)
  • {
  • returnValue = RegSetValueEx(hCle,nom,NULL,ChoisirType(type),(PBYTE)valeur,strlen(valeur));
  • if(returnValue != ERROR_SUCCESS)
  • {
  • if(GestionErreur)
  • OnRegError(ERR_ECRIRE);
  • return false;
  • }
  • return true;
  • }
  • bool Registre::CreerCle(char *base, char *chemin, HKEY *hCle)
  • {
  • HKEY hTempCle=0;
  • returnValue = RegCreateKey(ChoisirBase(base),chemin,&hTempCle);
  • if(returnValue != ERROR_SUCCESS)
  • {
  • if(GestionErreur)
  • OnRegError(ERR_CREERCLE);
  • return false;
  • }
  • *hCle = hTempCle;
  • return true;
  • }
  • bool Registre::SupprimerCle(char *base, char *chemin)
  • {
  • returnValue = RegDeleteKey(ChoisirBase(base),chemin);
  • if(returnValue != ERROR_SUCCESS)
  • {
  • if(GestionErreur)
  • OnRegError(ERR_SUPRCLE);
  • return false;
  • }
  • return true;
  • }
  • bool Registre::SupprimerValeur(char *base, char *chemin, char *nom)
  • {
  • HKEY hTempCle=0;
  • if(!OuvrirCle(base,chemin,&hTempCle))
  • return false;
  • returnValue = RegDeleteValue(hTempCle,nom);
  • if(returnValue != ERROR_SUCCESS)
  • {
  • if(GestionErreur)
  • OnRegError(ERR_SUPRVAL);
  • return false;
  • }
  • return true;
  • }
  • bool Registre::FermerCle(HKEY hCle)
  • {
  • returnValue = RegCloseKey(hCle);
  • if(returnValue != ERROR_SUCCESS)
  • {
  • if(GestionErreur)
  • OnRegError(ERR_FERMER);
  • return false;
  • }
  • return true;
  • }
/****
 * Class : Registre
 * Auteur: Shell
 * Date : 24/08/2004
 * Commentaires : Cette page de code contient la "class" permettant l'edition de la base de registre
 ***/

#include "RegistreErreur.h"

class Registre
{
	int returnValue;
	DWORD dwLen;
	LPBYTE dwKeyEn;
	
	HKEY ChoisirBase(char *base);
	unsigned long ChoisirType(char *type);
	

public:
	Registre();
	~Registre();

	bool GestionErreur;
	
	bool OuvrirCle(char *base, char *chemin, HKEY *hCle);
	char *LireValeur(HKEY hCle, char *nom, bool *OpRes);
	bool EcrireValeur(HKEY hCle, char *nom, char *valeur, char *type);
	bool CreerCle(char *base, char *chemin, HKEY *hCle);
	bool SupprimerCle(char *base, char *chemin);
	bool SupprimerValeur(char *base, char *chemin, char *nom);
	bool FermerCle(HKEY hCle);
		
};


Registre::Registre()
{
	dwKeyEn = NULL;
	dwLen = 0;
}

Registre::~Registre()
{
	delete dwKeyEn;
}

HKEY Registre::ChoisirBase(char *base)
{
	HKEY tBase=0;
	
	if(strcmp(base,"HKEY_CURRENT_USER")==0)
		tBase = HKEY_CURRENT_USER;	
	else if(strcmp(base,"HKEY_USERS")==0)
		tBase = HKEY_USERS;
	else if(strcmp(base,"HKEY_LOCAL_MACHINE")==0)
		tBase = HKEY_LOCAL_MACHINE;
	else if(strcmp(base,"HKEY_CURRENT_CONFIG")==0)
		tBase = HKEY_CURRENT_CONFIG;
	else if(strcmp(base,"HKEY_CLASSES_ROOT")==0)
		tBase = HKEY_CLASSES_ROOT;

	return tBase;
}

unsigned long Registre::ChoisirType(char *type)
{
	unsigned long hResType=0;
	
	if(strcmp(type,"REG_NONE")==0)
		hResType = REG_NONE;	
	else if(strcmp(type,"REG_SZ")==0)
		hResType = REG_SZ;
	else if(strcmp(type,"REG_BINARY")==0)
		hResType = REG_BINARY;
	else if(strcmp(type,"REG_DWORD")==0)
		hResType = REG_DWORD;
	else if(strcmp(type,"REG_DWORD_BIG_ENDIAN")==0)
		hResType = REG_DWORD_BIG_ENDIAN;
	else if(strcmp(type,"REG_LINK")==0)
		hResType = REG_LINK;
	else if(strcmp(type,"REG_MULTI_SZ")==0)
		hResType = REG_MULTI_SZ;

	return hResType;
}

bool Registre::OuvrirCle(char *base, char *chemin, HKEY *hCle)
{
	HKEY hTempCle=0;

	//Ouvre la clef ou se trouve la valeur
	returnValue = RegOpenKey(ChoisirBase(base), chemin, &hTempCle);
    if (returnValue != ERROR_SUCCESS)
    {
		if(GestionErreur)
			OnRegError(ERR_CLECHEMIN);
		return false;
	}
	
	*hCle = hTempCle;
	
	return 	true;
}

char *Registre::LireValeur(HKEY hCle, char *nom, bool *OpRes)
{
	
	//On recupere la taille de la clé dans un premier temps pour connaitre la taille du buffer que l'on va devoir spécifié
	returnValue = RegQueryValueEx(hCle, nom, NULL, NULL, NULL, &dwLen);
	//On alloue la taille nécéssaire pour éviter les dépassement de caaciter qui risqueraient décrassé d'aure varaible de la mémoire
    dwKeyEn = new BYTE[dwLen];
	//Maintenant on lit la valeur de la clé en spécifiant la taille du buffer
	returnValue = RegQueryValueEx(hCle, nom, NULL, NULL, dwKeyEn, &dwLen);

	if(returnValue != ERROR_SUCCESS)
    {
		*OpRes = false;
		if(GestionErreur)
			OnRegError(ERR_NOM);
		return "Erreur!";
	}
	*OpRes = true;
	return (char*)dwKeyEn; //on retourne le résultat a l'aide d'un CAST
}

bool Registre::EcrireValeur(HKEY hCle, char *nom, char *valeur, char *type)
{
	returnValue = RegSetValueEx(hCle,nom,NULL,ChoisirType(type),(PBYTE)valeur,strlen(valeur));
	if(returnValue != ERROR_SUCCESS)
    {
		if(GestionErreur)
			OnRegError(ERR_ECRIRE);
		return false;
	}

	return true;
}

bool Registre::CreerCle(char *base, char *chemin, HKEY *hCle)
{
	HKEY hTempCle=0;
	
	returnValue = RegCreateKey(ChoisirBase(base),chemin,&hTempCle);
	if(returnValue != ERROR_SUCCESS)
    {
		if(GestionErreur)
			OnRegError(ERR_CREERCLE);
		return false;
	}
	
	*hCle = hTempCle;

	return true;
}

bool Registre::SupprimerCle(char *base, char *chemin)
{
	returnValue = RegDeleteKey(ChoisirBase(base),chemin);
	if(returnValue != ERROR_SUCCESS)
    {
		if(GestionErreur)
			OnRegError(ERR_SUPRCLE);
		return false;
	}
	return true;
}

bool Registre::SupprimerValeur(char *base, char *chemin, char *nom)
{
	HKEY hTempCle=0;		
	
	if(!OuvrirCle(base,chemin,&hTempCle))
		return false;

	returnValue = RegDeleteValue(hTempCle,nom);
	if(returnValue != ERROR_SUCCESS)
	{
		if(GestionErreur)
			OnRegError(ERR_SUPRVAL);
		return false;
	}

	return true;
}

bool Registre::FermerCle(HKEY hCle)
{
	returnValue = RegCloseKey(hCle);
	if(returnValue != ERROR_SUCCESS)
    {
		if(GestionErreur)
			OnRegError(ERR_FERMER);
		return false;
	}

	return true;
}

 Conclusion

Voili voilou pour ce qui est du code .... la gestion des erreurs est dans un header independant.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

24 août 2004 01:00:50 :
Correction d'un bug concernant l'allocation mémoire dynamique et la récupération de données dans le registre
24 août 2004 01:07:14 :
Mise à jour du code en ligne

 Sources du même auteur

Source avec Zip DECOUPAGE CHEMIN FICHIER (FORUM)
Source avec Zip Source avec une capture PARAMETRAGE CARTES RESEAUX (VC++ SANS MFC) (FORUM)
Source avec Zip Source avec une capture DRAG AND DROP DE FICHIERS (MFC) (FORUM)
Source avec Zip TIMER (VC++ SANS MFC) (FORUM)
Source avec Zip Source avec une capture PROGRAME MULTI-DIALOG (VC++ SANS MFC) (FORUM)

 Sources de la même categorie

Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture LECTURE FRÉQUENCE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE par pgl10
Source avec Zip Source avec une capture POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE ... par pgl10

Commentaires et avis

Commentaire de ymca2003 le 05/02/2004 00:38:24

une remarque : lorsque tu appelle la fonction RegQueryValueEx, tu donne l'adresse d'une variable de type "double" comme buffer de récup. si les données à récupérer dépasse la taille d'un "double", cela va écraser les variables qui se situent en mémoire à la suite.

L'intérêt de récupérer la taille nécessaire est justement pour allouer dynamiquement un buffer de la taille voulue.

Ce que tu peut faire, c'est mettre un pinteur de type BYTE* comme membre de la classe et alloué sa taille avant chaque appel à RegQueryValueEx tout en supprimant l'ancien avant s'il a déjà été alloué.

Dans le constructeur : init à NULL.
Dans de destructeur : destruction du buffer éventuellement alloué.

Commentaire de DeAtHCrAsH le 05/02/2004 15:11:25

On peut coir ca comme tu l'as fait ... Mais maintenant je retourne le probleme que tu vients de me poser ... Dans le cas ou ma valeur depasserai les capacités mémoires de l'ordi comment dois-je faire ???
Il y aura toujours des limites en informatiques....
Dans mon cas la longueur d'un double est quand meme largement suffisant pour stocker la taille de la valeur a lire dans la bdr ....
Mon probleme etait surtout de pouvoir lire toutes les valeurs qu'il y avait dans la bdr de mon pc qui est plutot bien garni ... Et le résultat a été plus que satisfaisant !!!
T'as remarque n'en reste pas moin constructive ;)

A++ et bonn prog....

SheLL

P.S : Les commentaires ne sont pas la que pour moi .... Il m'aide entre autre a avancer dans mon travail, mais aussi a vous qui comme moi etes parfois limité par les connaissances dans certains domaine en programmation ...
Pour les notes ca fait tjs plaisirs :p

Commentaire de ymca2003 le 06/02/2004 00:50:42

Je croit que tu n'a pas compris ce que je voulais dire :

la fonction RegQueryValueEx attend comme avant dernier paramètre un pointeur vers les données à récupérer. Selon le type, il faut fournir :
REG_BINARY : un tableau de BYTE.
REG_DWORD : un pointeur sur DWORD.
REG_SZ : un tableau de char.

La taille retourné par le premier appel à RegQueryValueEx et mis dans dwlen te permet de savoir la taille du tableau à passer en paramètre pour pouvoir récupérer les données.

en passant un pointeur sur une variable de type 'double' que tu cast en LPBYTE, tu fourni en fait un tableau de 8 octets (la taille d'un double).

si la valeur que tu souhaite récupérer est une chaîne de caractères contenant 20 caractères, la fonction va écrire les 8 premiers dans la variable de type double, castée en char*, puis le reste à la suite.

C'est sur, tu va récupérer les données, mais si une variable se trouve juste après dwKeyEn, elle sera tout simplement écrasée.

pour t'en persuader, rajouter cette ligne au début juste après
double dwKeyEn = sizeof(long);
char szText[] = "Hello world";

et dans LireValeur :

MessageBox(NULL, szText, "msg", 0);

//On recupere la taille de la clé dans un premier temps pour connaitre la taille du buffer que l'on va devoir spécifié
returnValue = RegQueryValueEx(hCle, nom, NULL, NULL, NULL, &dwLen);
//Maintenant on lit la valeur de la clé en spécifiant la taille du buffer
returnValue = RegQueryValueEx(hCle, nom, NULL, NULL, (LPBYTE)&dwKeyEn, &dwLen);

MessageBox(NULL, szText, "msg", 0);

lance ton prog et ouvre une clé contenant du texte de plus de 8 caractères et regarde les messages.

l'allocation dynamique permet d'éviter cela par ex en faisant
char* szVal = new char[dwLen+1]; avant de récupéréer la chaîne.

Ne t'imquiète pas en ce qui concerne la saturation de la mémoire, dwLen ne dépassera jamais quelque dizaines d'octets au max (sinon le registre aurais qqe pb lors du chargement si des clés étaient trop grandes)

Commentaire de Kornferki le 26/03/2004 14:43:32

Est il possible d effectuer une recherche dans les valeurs des registres pour une certaine chaine et ensuite de remplacer la chaine par une autre ? Pour changer en une fois des setting de plusieurs applications.

Est ce que je peux utiliser RegQueryValueEx ?

Commentaire de DeAtHCrAsH le 24/08/2004 01:08:20

Le code a été mis à jour et les quelques bug éventuels ont été corrigés.

Shell

Commentaire de magic_Nono le 01/09/2004 21:53:45

C bien ce que je pensais
ce code, meme s'il semble le gérer ne récupère pas lui non plus les REG_MULTI_SZ

ou alors C que je me suis planté ds son implémentation... je me suis inspiré de LireValeur

en est -il de meme pour ces types que je ne gérais pas...:

6 REG_LINK A Unicode symbolic link. Used internally; applications should not use this type.
8 REG_NONE No defined value type.
9 REG_FULL_RESOURCE_DESCRIPTOR // Resource list in the hardware description
10 REG_RESOURCE_REQUIREMENTS_LIST ( 10 )


????

++
sinon, un bon source
ou quasi tout code ce trouve ds le header

C bien mais, tu C, Shell, il existe un mot clef nommé inline....

autrement une rq sur ta gestion d'erreur :
err->style = MB_ICONSTOP;
peut se factoriser
voir mm, ce champ peut sauter


voilà

à très bientot
Magicalement,

Nono.

Commentaire de Sylvainlefou le 08/11/2004 18:28:39

Main.obj : error LNK2001: unresolved external symbol "struct HWND__ * hDlg" (?hDlg@@3PAUHWND__@@A)

j'ai cette erreure lorceque j' include Registre.h, sous VC++ 6 et que je compil

Voila merci de me repondre

          Sylvain

PS : Je suis un n00b en C++, je vien du VB et delphi

Commentaire de magic_Nono le 09/11/2004 17:38:03

utilise donc les MFC

tu te compliqueras moins la vie...

après, si tu as du tps à y consacrer....

++

Commentaire de Sylvainlefou le 09/11/2004 19:03:09

ok merci, pour le bug j'ai trouvé, il suffit de desactiver la gestion des erreures

Commentaire de magic_Nono le 10/11/2004 09:10:40

ça c'est de la soluce !

ferme les yeux, tu auras moins peur
lol

Commentaire de charled le 15/12/2004 19:54:04

Bon voilà ton code est super mais quand je l'ai testé, j'ai eu des interrogations:
j'ai créé une valeur DWORD mais dans le champ valeur j'ai mis la valeur : 0x00000001 qui correspond en décimal à 1 mais cela ne marche pas, par contre si je mets 0xFF là cela marche et je ne comprends pas pourquoi, quelqu'un pourrait -il m'expliquer le fonctionnement, c'est une valeur en binaire, hexadécimal, décimal...

Commentaire de charled le 15/12/2004 19:56:32

pardon j'ai oublié de préciser que si je rentre 0x00
il m'affiche dans le registre en hexadécimal: 30307830

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales