LE REGISTRE FACILE (VC++ SANS MFC)

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 5 févr. 2004 à 00:38
cs_charled Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 11 septembre 2006 - 15 déc. 2004 à 19:56
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/20138-le-registre-facile-vc-sans-mfc

cs_charled Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 11 septembre 2006
15 déc. 2004 à 19:56
pardon j'ai oublié de préciser que si je rentre 0x00
il m'affiche dans le registre en hexadécimal: 30307830
cs_charled Messages postés 5 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 11 septembre 2006
15 déc. 2004 à 19:54
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...
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
10 nov. 2004 à 09:10
ça c'est de la soluce !

ferme les yeux, tu auras moins peur
lol
Sylvainlefou Messages postés 43 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 15 février 2006
9 nov. 2004 à 19:03
ok merci, pour le bug j'ai trouvé, il suffit de desactiver la gestion des erreures
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
9 nov. 2004 à 17:38
utilise donc les MFC

tu te compliqueras moins la vie...

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

++
Sylvainlefou Messages postés 43 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 15 février 2006
8 nov. 2004 à 18:28
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
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
1 sept. 2004 à 21:53
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.
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
24 août 2004 à 01:08
Le code a été mis à jour et les quelques bug éventuels ont été corrigés.

Shell
Kornferki Messages postés 17 Date d'inscription jeudi 25 mars 2004 Statut Membre Dernière intervention 6 décembre 2004
26 mars 2004 à 14:43
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 ?
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
6 févr. 2004 à 00:50
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)
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
5 févr. 2004 à 15:11
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
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
5 févr. 2004 à 00:38
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é.
Rejoignez-nous