C#在64位操作系统上读取错误的注册表数据
我正在使用64位Windows,我的应用程序以提升的权限运行。 我有一个问题,以下非常简单的代码:
myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionRun"); if (myKey != null) { string[] HKLMvaluenames = myKey.GetValueNames(); }
但由于某种原因,HKLMvaluenames数组中填充了以下键中的值:
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionRun
有没有解决这个问题的方法?
这是设计使然,32位程序具有与64位程序不同的注册表视图。 当它们尝试从HKLM Software配置单元读取值时,它们将重定向到HKLM Software Wow6432Node键。 如果使用Project + Properties,Build选项卡,Platform Target = Any CPU构建C#程序,那么它将作为64位程序运行,不会被重定向。
32位程序可以取消重定向,但使用.NET RegistryKey类并不容易。 P /使用KEY_WOW64_64KEY选项调用RegOpenKeyEx是必需的。 此Windows SDK文章中提供了更多信息。
编辑:现在,.NET也可以使用.NET 4特定的RegistryKey.OpenBaseKey()方法。 传递RegistryView.Registry64以64位进程的方式查看注册表。
虽然我遇到了同样的问题或同样关注这个问题的原因,但我找到了一个解决方案。
用这个:
//To set the Base to the right path set RegistryView to DEFAULT, Registry64 or Registry32 regarding the path you need. If you want to go over the x64 root: RegistryKey rk = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) .OpenSubKey(@"SOFTWAREMicrosoftWindowsCurrentVersionRun");
现在它会按照你想要的方式行事。
玩得开心!
这是另一篇文章的副本。 以下是一些应该有用的信息。
如何从32位应用程序读取64位注册表,反之亦然
上述就是C#学习教程:C#在64位操作系统上读取错误的注册表数据分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1030771.html