web-dev-qa-db-fra.com

Pourquoi RegOpenKeyEx () renvoie le code d'erreur 2 sur Vista 64 bits?

Je faisais l'appel suivant:

result = RegOpenKeyEx(key, s, 0, KEY_READ, &key);

(C++, Visual Studio 5, Vista 64 bits).

Il échoue avec le code d'erreur 2 ("Fichier introuvable") même si "regedit" montre que la clé existe. Ce code a toujours fonctionné sur XP 32 bits. Pourquoi est-il "fichier introuvable" alors qu'il est clairement là?

29
Tim Cooper

J'ai découvert que je pouvais résoudre mon problème en utilisant l'indicateur: KEY_WOW64_64KEY , un péché:

result = RegOpenKeyEx(key, s, 0, KEY_READ|KEY_WOW64_64KEY, &key);

Pour une explication complète: Données d'application 32 bits et 64 bits dans le Registre

57
Tim Cooper

Sur un système Windows 64 bits, le registre est en fait divisé en deux parties. Une section est utilisée par les processus 64 bits et une partie par les processus 32 bits.

Par exemple, si une application 32 bits écrit par programme dans ce qu'elle pense être HKLM\SOFTWARE\Company\Application, elle est en fait redirigée par la couche WoW64 vers HKLM\SOFTWARE\Wow6432Node\Company\Application.

Ainsi, lorsque vous exécutez votre application 32 bits et appelez RegOpenKeyEx, cela fonctionne en fait sur le dossier Wow6432Node\et non sur le nœud\SOFTWARE normal.

23
Frode Lillerud

Vous devez compiler avec "Utiliser un jeu de caractères multi-octets" ou transtyper la chaîne dans le code en (LPWSTR)

1
GMG

oui , win7 64B, ajoutez un autre indicateur KEY_WOW64_64KEY, cela fonctionnera. si cela ne fonctionne pas, reportez-vous à http://msdn.Microsoft.com/en-us/library/ms724897 (v = VS.85) .aspx

0
yue

J'avais un problème similaire. J'utilisais:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   (LPWSTR)"SOFTWARE\\0test",
                                   0,
                                   WRITE_DAC ,
                                   &hKey);

Ça n'a pas marché. Je l'ai essayé comme ça et ça a fonctionné:

dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                                   _T("SOFTWARE\\0test"),
                                   0,
                                   WRITE_DAC ,
                                   &hKey);
0
Alex