我的老板刚拿到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注册表重定向正常工作?
答案 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)