90 votes

OpenSubKey() renvoie un résultat nul pour une clé de registre que je peux voir dans regedit.exe.

J'essaie d'obtenir tous les noms d'affichage des sous-clés de cette clé :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Avec ce code :

     RegistryKey newKey;
     string val;

     string KeyPath64Bit = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
     RegistryKey mainKey = Registry.LocalMachine.OpenSubKey(KeyPath64Bit);

     string[] RegKeys64Bits = Registry.LocalMachine.OpenSubKey(KeyPath64Bit).GetSubKeyNames();

     foreach (string s in RegKeys64Bits)
     {
        newKey = mainKey.OpenSubKey(s);
        val = newKey.GetValue("DisplayName", -1, RegistryValueOptions.None).ToString();
        if (val != "-1")
           file64.WriteLine(val);
     }

Après avoir exécuté le code, je ne trouve pas une des clés dont j'ai besoin :

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}

Et il devrait avoir le nom d'affichage : Microsoft Visual C++ 2010 x64 Redistributable - 10.0.30319, mais au lieu de cela le GetSubKeyNames() La méthode me donne la sous-clé : {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757 qui n'a pas de nom d'affichage.

Pourquoi je ne peux pas obtenir la sous-clé exacte dont j'ai besoin ( {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} ) et comment puis-je l'obtenir ?

208voto

Richard Deeming Points 9808

Une application 32 bits sur un système d'exploitation 64 bits regardera l'adresse de l'utilisateur. HKLM\Software\Wow6432Node par défaut. Pour lire la version 64 bits de la clé, vous devez spécifier l'attribut RegistryView :

using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
using (var key = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
{
   // key now points to the 64-bit key
}

L'API pour ce faire a été ajoutée dans .NET 4.0 ; si vous utilisez toujours la version 3.5, vous devrez utiliser P/Invoke pour accéder aux clés 64 bits : http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a-32-bit-application-or-vice-versa/

20voto

Clint Points 1216

Dans Visual Studio 2017, allez dans

Project > Properties > Build > Uncheck **Prefer 32-bit** and Platform target as **Any CPU**.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X