2013-03-15 110 views
13

我正在運行我的應用程序,編譯爲x86,並且它在64位Windows上運行。從同一應用程序讀取和寫入x86和x64註冊表項

爲了解決ClickOnce文件關聯問題,我想從註冊表的x86視圖中讀取一些CLSID值,然後將它們寫入到x64視圖。

要清楚,這意味着從x86應用程序我想要同時從x86註冊表視圖中讀取,然後寫入到x64註冊表視圖。我想獲取我在HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}下找到的值,並將它們寫入HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}

我該怎麼做?使用RegistryView會產生意想不到的結果。例如,這OpenSubKey調用返回NULL:

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

如果我使用RegistryView.RegistryDefaultRegistryView.Registry64而返回的關鍵 - 但我希望它使用Registry64何時返回null,因爲該密鑰不會在64看法存在並且不應該發生重定向。

正在使用RegistryView要做的事情,還是應該直接使用WinAPI?

回答

19

我可能會誤解你所問的內容,但如果你在32位進程中運行,那麼你的密鑰無論如何都會在Wow6432Node\xxxxx節點中。因此,如果您試圖從HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}(並且未手動指定64位視圖)將它們複製到HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid},則您將複製相同的值。此代碼應工作:

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

謝謝@Zipper,你的答案是正確的 - 我在我的腦子裏的東西后到前(這不是很明顯,Registry32從Wow6432Node節點撿東西)。 – slugster 2013-03-15 07:03:19

+0

@ Zipper我有一些疑惑。 32位應用程序可以訪問註冊表的64位配置單元。我不確定這一點。 – 2013-03-15 07:34:03

+0

只是一個側面說明:如果您在.NET4之前使用.NET,這種方法將不適用於您.. – Luke 2015-03-19 15:21:06

相關問題