ejw*_*ipp 3 registry redirect visual-studio-2005 setup-deployment windows-7
我的老板刚刚安装了 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);
Run Code Online (Sandbox Code Playgroud)
那么,我的新问题是如何访问注册表以使 Windows 9 注册表重定向正常工作?
如果您使用的是 .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");
Run Code Online (Sandbox Code Playgroud)
该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);
}
Run Code Online (Sandbox Code Playgroud)
在 64 位版本的 Windows 上,上述代码将从注册表中删除以下子项树:
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\AcmeSoft\SomeKeyWeNoLongerWant
Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\AcmeSoft\SomeKeyWeNoLongerWant
Run Code Online (Sandbox Code Playgroud)
-亚当
| 归档时间: |
|
| 查看次数: |
2831 次 |
| 最近记录: |