Csharp/C#教程:C#在64位操作系统上读取错误的注册表数据分享


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

(1)
上一篇 2022年1月13日
下一篇 2022年1月13日

精彩推荐