2013-03-15 47 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

相关问题