2010-02-04 5 views
13

J'ai un programme d'installation de Visual Studio qui crée des clés de Registre:Créer 64 clé de Registre de bits (non WOW64) à partir d'une application 32 bits

HKEY_LOCAL_MACHINE\SOFTWARE\MyApp 

mais les clés de registre, il est en train de créer apparaissent automatiquement sous Wow6432Node :

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp 

Comment puis-je ignorer la Wow6432Node lors de la création des clés de registre dans mon code C# en cours d'exécution par le msi?

+0

Je suppose, puisque votre application est en 32 bits, Windows assurez-vous que les modifications relèvent du 'Wow6432Node'. Pour le sortir de ce nœud et placer les entrées sous des chemins normaux, votre application devrait être 64 bits. – legends2k

Répondre

21

Just FYI, .NET 4.0 le supporte nativement. Exemple:

RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 

Vous pouvez ensuite utiliser cette RegistryBase variable pour accéder à quoi que ce soit dans la vue 64 bits de HKLM. Inversement, Registry32 permettra à une application 64 bits d'accéder à la vue 32 bits du registre.

+1

bonne réponse. simple et précis. – Simon

1

Jetez un oeil à http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html. Vous devrez utiliser le redirecteur de registre et transmettre la valeur appropriée pour le masque d'accès. Malheureusement, vous aurez besoin de pInvoke.

+0

Oh fantastique. Y at-il une bonne API .NET autour que quelqu'un a écrit pour envelopper les appels PinVoke et le rendre pas si terrible? –

+0

Je ne dirais pas que c'est vraiment terrible. Un peu gênant peut-être. Ajoutez simplement les DllImports et définissez KEY_WOW64_64KEY. Un exemple plus concis (pour suppression) peut être trouvé sur http://geekswithblogs.net/derekf/archive/2007/06/26/113485.aspx. – nithins

1

Comme il y a très peu de documentation sur OpenBaseKey, je vais étendre sur la réponse de shifuimam et de fournir une solution pour l'OP:

Private Sub Foo() 
    Dim myAppIs64Bit = Environment.Is64BitProcess 
    Dim baseKey As RegistryKey 
    If (myAppIs64Bit) Then 
     baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) 
    Else 
     baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32) 
    End If 
    Dim myAppKey As RegistryKey = baseKey.OpenSubKey("SOFTWARE\MyApp") 
End Sub 

Si l'application est de 32 bits, myAppKey des points à HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp. Si 64 bits, il pointe à HKEY_LOCAL_MACHINE\SOFTWARE\MyApp.

L'avantage de OpenBaseKey est qu'il ne nécessite pas de référence Wow6432 dans votre code.

Questions connexes