Problème gestion base de regsitre en C++ sous vista 64

Signaler
Messages postés
5
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
3 décembre 2009
-
Messages postés
5
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
3 décembre 2009
-
Bonjour,
j'utilise une librairie pour gérer la base de registre en c, dont l'auteur est :
	
        // Support for the Windows Registry
// Version 5.10 (1st October)
// License - Free for any purpose, just do not remove the copyright
// Copyright (C) 1996-2006 - Jonathan Wilkes


Cette librairie a toujours fonctionné, avec windows Xp, mais sous Vista 64, elle n'arrive pas à a accéder à la clé
HKEY_LOCAL_MACHINE\SOFTWARE
par contre, elle accède sans pb à la clé
HKEY_LOCAL_MACHINE\HARDWARE
J'ai constaté, par regedit, que les autorisations sont différentes pour ces 2 clés.
est-ce que c'est l'explication ?
comment y remédier ?
Merci
Gérald


RegKey NewKey;
//RegKey::OpenKey(LPCTSTR pszKeyName, bool bCreateIfNoExist /* false */, HKEY hBaseKey /* HKEY_CURRENT_USER */, LPCTSTR pszMachineName /* = NULL */)
if (! NewKey.OpenKey("SOFTWARE", false, HKEY_LOCAL_MACHINE ))
cout << "clée SOFTWARE trouvée " << endl << endl;
else
cout << "clée SOFTWARE non trouvée " << endl << endl;

//end try with regkey

5 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
Comme toute surcouche c'est nuisible car ça masque ce qu'il faut faire.
Va voir les params de RegOpenKeyEx sur MSDN et tu comprendras vite qu'i manque l'essentiel dans ta lib prémachée.
HKLM exclusivement en lecture depuis simple prog.
Regarde aussi le flag KEY_WOW64_64KEY.

ciao...
BruNews, MVP VC++
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
Par défaut, sur un OS x64, si on fait un RegOpen de HKEY_LOCAL_MACHINE\SOFTWARE\MySoft :
- un process 64bit accède à HKEY_LOCAL_MACHINE\SOFTWARE\MySoft
- un process 32bit accède en réalité à HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MySoft

Pour forcer à lire dans la partie 32 ou 64bit, quelque soit l'architecture du soft (32 ou 64bit), il faut faire ce qu'a indiqué BruNews.
Messages postés
5
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
3 décembre 2009

Salut,
Merci de cette réponse rapide.
J'avais bien lu des choses à propos de ce Wow6432Node, mais j'avais pas bien saisit.
J'ai pu tester, effectivement, je me retrouve sur Wow6432Node, et la valeur que je cherche à lire ne s'y trouve pas.
Ce qui est idiot, c'est que j'ai simplement besoin de lire, pas d'écrire, donc il faut que je modifie les parametres de la classe OpenKey pour qu'elle spécifie "lecture seule".
J'ai essayé avec les 2 options :

if (! clAutocad.ouvrir(HKEY_LOCAL_MACHINE,"SOFTWARE",KEY_ALL_ACCESS))//version originale

if (! clAutocad.ouvrir(HKEY_LOCAL_MACHINE,"SOFTWARE",KEY_READ))//ne donne rien de mieux

if (! clAutocad.ouvrir(HKEY_LOCAL_MACHINE,"SOFTWARE",KEY_WOW64_64KEY))//ne marche pas !


Je suis allé voir RegOpenKeyEx sur MSDN, et je n'ai rein vu de particulier concernant mon problème
par contre sur cette page :
Registry Key Security and Access Rights
mais je ne comprends pas les explications.

maintenant, c'est assez compliqué pour moi, je ne programme pratiquement qu'en lisp, et un peu en VB, sous la torture.
ce que je cherche, c'est une librairie qui integre cette nouveauté des Os 64, et qui me permette de faire marcher ce petit bout de prog.
Merci
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
KEY_WOW64_64KEY | KEY_QUERY_VALUE
en 4eme param.

S'il te faut une lib pour 3 fonctions, t'es pas rendu.
RegOpenKeyEx
RegQueryValueEx
RegCloseKey

ciao...
BruNews, MVP VC++
Messages postés
5
Date d'inscription
mardi 5 juin 2007
Statut
Membre
Dernière intervention
3 décembre 2009

merci des réponse, mais tant pis, je ne comprend pas, je n'y arrive pas.
la classe clAutocad.ouvrir ne fait rien d'autre qu'un RegOpenKeyEx, mais elle n'accepte pas les parametres
(! clAutocad.ouvrir(HKEY_LOCAL_MACHINE,"SOFTWARE",KEY_WOW64_64KEY | KEY_QUERY_VALUE )
et moi je n'arrive pas a le refaire par un :
	long resu;
long laCle;

resu=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE",0,KEY_QUERY_VALUE);
if (resu==ERROR_SUCCESS)
initialisee=TRUE;
return initialisee;

ça, ça ne marche pas à cause de "lacle".

en fait, je ne cherche pas vraiement à programmer en c, mais simplement à maintenir en fonctionnement un programme qui m'était bien utile, mais que je n'arrive plus à comprendre ...

salut,
Gégé