Pourquoi RegOpenKeyEx() renvoie-t-il le code d'erreur 2 sur Vista 64bit?
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 32bit XP. Pourquoi est-ce "fichier introuvable" quand il est clairement là?
5 réponses
J'ai découvert que je ne pouvais résoudre mon problème en utilisant le drapeau: KEY_WOW64_64KEY
, comme dans
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
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 croit être HKLM\SOFTWARE\Company\Application, elle est en fait redirigée par la couche WoW64 vers HKLM\SOFTWARE\Wow6432Node\Company\Application.
Donc, lorsque vous exécutez votre application 32 bits et appelez RegOpenKeyEx, cela fonctionne réellement contre le Wow6432Node \ folder, et non le nœud \SOFTWARE régulier.
Vous devez compiler avec "Utiliser un jeu de caractères multi-octets" ou convertir une chaîne dans le code en (LPWSTR)
J'ai eu un problème similaire. J'ai été en utilisant:
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 marché:
dwResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\0test"),
0,
WRITE_DAC ,
&hKey);
Oui, win7 64B, ajouter d'autres drapeau KEY_WOW64_64KEY, il va travailler. si ce n'est pas le cas, reportez-vous à http://msdn.microsoft.com/en-us/library/ms724897 (v=vs.85).aspx