2013-03-15 11 views
13

Sto eseguendo la mia applicazione compilata come x86, ed è in esecuzione su Windows 64 bit.Lettura e scrittura di chiavi di registro x86 e x64 dalla stessa applicazione

Per risolvere un problema con le associazioni di file ClickOnce, voglio leggere alcuni valori CLSID dalla vista x86 del registro e quindi scriverli nella vista x64.

Per essere chiari, questo significa che da un'applicazione x86 voglio contemporaneamente leggere dalla vista del registro x86 e quindi scrivere nella vista del registro x64. Voglio prendere i valori che trovo sotto HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid} e scriverli a HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}.

Come devo fare? L'utilizzo di RegistryView produce risultati imprevisti. Ad esempio, questo OpenSubKey chiamata restituisce null:

keyPath = @"Software\Classes\CLSID\" + clsid; 
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32); 
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree); 

Se uso RegistryView.RegistryDefault o RegistryView.Registry64 ma restituisce la chiave - ma vorrei aspettare di tornare nulla quando si utilizza Registry64 perché quella chiave non esiste nella visualizzazione x64 e non dovrebbe esserci alcun reindirizzamento.

Si sta utilizzando un RegistryView la cosa appropriata da fare, o dovrei utilizzare direttamente WinAPI?

risposta

19

Potrei essere fraintendere quello che stai chiedendo, ma se stai eseguendo un processo a 32 bit tutte le tue chiavi saranno comunque nel nodo Wow6432Node\xxxxx. Quindi, se hai provato a copiarli da HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid} (e non hai specificato manualmente la vista a 64 bit) su HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid} copierai gli stessi valori. Questo codice dovrebbe funzionare:

keyPath = @"Software\Classes\CLSID\" + clsid; 
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32); 
// Note this calls HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}: 
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree); 

var regularx64View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64); 
// Note this calls HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}: 
var regularClassKey = regularx64View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree); 
+0

Grazie @Zipper, la risposta era corretta - ho avuto le cose a rovescio nella mia mente (non era ovvio che Registry32 stava raccogliendo roba dal nodo Wow6432Node). – slugster

+0

@Zipper Ho dei dubbi. L'applicazione a 32 bit può accedere all'hive di registro a 64 bit. Non sono sicuro di questo. –

+0

Solo una nota a margine: se si utilizza un .NET prima di .NET4, questo approccio non funzionerà per voi. – Luke

Problemi correlati