2

我的老板刚安装了 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

4 回答 4

4

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

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

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

var hklm64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
var key = hklm.OpenSubKey(@"SOFTWARE\AcmeSoft\AnvilMaker 1.0");
var value = (string) key.GetValue("Blacksmith Name");

RegistryKey.OpenBaseKey方法还允许您显式打开注册表的 32 位视图。如果您试图反过来并从 64 位进程访问注册表的 32 位视图,并且您不想显式地将“Wow6432Node”添加到注册表路径,这将很有用。

例如,今天我需要在注册表的 32 位和 64 位视图中删除一个子键。在 .NET 4 中使用单个注册表路径执行此操作很容易:

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

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

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\AcmeSoft\SomeKeyWeNoLongerWant
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AcmeSoft\SomeKeyWeNoLongerWant

-亚当

于 2011-11-08T19:54:42.503 回答
2

经过更多挖掘后,我发现了这个链接,它描述了 .NET 应用程序的注册表访问规则。我的程序最初是针对“AnyCpu”的,这会导致应用程序针对 64 位注册表,即使 Windows 将它安装在 Wow6432Node 下。通过将目标设置为“x86”,我的程序“神奇地”开始访问 Wow6432Node 下的注册表。去搞清楚!

于 2010-02-17T23:03:20.270 回答
1

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

于 2010-02-17T22:17:31.203 回答
0

注册表反射

代码示例

于 2010-02-17T21:59:51.380 回答