如何在32位c#app中读取注册表,以便注册表重定向在64位Windows 7上运行

时间:2010-02-17 19:49:35

标签: visual-studio-2005 windows-7 registry redirect setup-deployment

我的老板刚拿到Windows 7,他尝试运行我们的一个安装程序,在XP下运行完美。在Windows 7上,安装程序运行时不会出现任何错误。但是,它不会在HKEY_LOCAL_MACHINE \ SOFTWARE {Company} {product}下创建注册表项。这些键在XP下正确创建。

有没有人遇到过这个问题?我怀疑这是一个权利/安全问题,但我不确定,我没有Windows 7进行试验。

修改

有问题的计算机是运行64位Windows的64位计算机。事实证明,Windows 7将32位应用程序重定向到HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node {Company} {product}。问题是我的应用程序代码尝试使用如下硬编码值访问注册表:

var t = Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\..., "ValueName", DefaultValue);

所以,我的新问题是如何访问注册表以使Windows 9注册表重定向正常工作?

4 个答案:

答案 0 :(得分:3)

如果您使用的是.NET 4 ,则可以使用{{1}专门请求您的32位(或64位)进程访问注册表的64位视图方法。

比照。 http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.openbasekey.aspx

这是一个从注册表的64位视图中读取值的示例,即使它作为32位进程的一部分运行:

RegistryKey.OpenBaseKey

var hklm64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); var key = hklm.OpenSubKey(@"SOFTWARE\AcmeSoft\AnvilMaker 1.0"); var value = (string) key.GetValue("Blacksmith Name"); 方法还允许您显式打开注册表的32位视图。如果您尝试反过来并从64位进程访问注册表的32位视图并且您不希望将“Wow6432Node”显式添加到注册表路径,那么这非常有用。

例如,今天我需要删除中的子密钥树注册表的32位和64位视图。使用单一注册表路径在.NET 4中执行此操作非常简单:

RegistryKey.OpenBaseKey

在64位版本的Windows上,上面的代码将从注册表中删除以下子键树:

foreach(var view in new[] {RegistryView.Registry32, RegistryView.Registry64})
{
     var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, view);
     hklm.DeleteSubKeyTree(@"SOFTWARE\AcmeSoft\SomeKeyWeNoLongerWant", throwOnMissingSubKey: false);
}   

- 亚当

答案 1 :(得分:2)

经过多次挖掘后,我遇到了这个link,它描述了.NET应用程序的注册表访问规则。我的程序最初的目标是“AnyCpu”,这导致应用程序以64位注册表为目标,即使Windows在Wow6432Node下安装它。通过将目标设置为“x86”,我的程序“神奇地”开始访问Wow6432Node下的注册表。去图!

答案 2 :(得分:1)

在C Windows API中,可以通过samDesired调用KEY_WOW64_64KEY中的RegOpenKeyEx参数来完成此操作。这意味着注册表值的查找将映射到常规的64位条目,而不是WOW32Node条目。我无法看到你如何在.Net中实现这一点,尽管因为Registry类似乎不支持这些操作,但也许它是通过一个较新的类提供的?

答案 3 :(得分:0)