2008-10-31 7 views
25

je faisais l'appel suivant:Pourquoi RegOpenKeyEx() renvoie le code d'erreur 2 sur Vista 64bit?

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

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

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

Répondre

51

J'ai découvert que je 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: 32-bit and 64-bit Application Data in the Registry

20

Sur un système Windows 64 bits du 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 programmation sur 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. Par conséquent, lorsque vous exécutez votre application 32 bits et que vous appelez RegOpenKeyEx, cela fonctionne réellement sur le dossier Wow6432Node \ et non sur le nœud \ SOFTWARE standard.

+2

Notez que vous ne devez pas compter sur la clé appelée « Wow6432Node ". Accédez à l'autre vue du registre en utilisant les drapeaux de 'RegOpenKeyEx' à la place. –

0

J'ai eu un problème similaire. j'utilisais:

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

Cela ne fonctionne pas. Je l'ai essayé comme ça et ça a marché:

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

N'insérez jamais des distributions pour fermer le compilateur. Le compilateur a correctement refusé de compiler le premier sans cast. –

0

Vous devez compiler avec « Utiliser multi-octets Jeu de caractères » ou une chaîne coulée en code (LPWSTR)

Questions connexes