我为什么不能在64位计算机上的HKCU中正确读取32位注册表值?

我为Windows 7注册表问题感到困惑,尽管各种问题和答案为我提供了一些解决方法,但我所见不到的解决了我的特定问题.我不知道其他Windows版本是否会影响此问题,但是我们都有win7x64机器.

我们在工作中使用多种工具,包括一些C,一些C#,一些python(2.6)等.我们还同时运行32位和64位工具.过去,我们很高兴将注册表信息存储在HKLM中.我们一直在努力将东西转移到HKCU.关于是否执行此操作,是否影响UAC等,我们进行了很多讨论.我们确实想尝试并采取这一措施.说:

我们无法从HKCU /软件/ CompanyABC / App中读取/写入注册表项.我们有一个使用python写的安装应用,它使用_winreg将注册表项写出到上述位置.无论我们是否指定KEY_WRITE | KEY_WOW64_32KEY或仅指定KEY_WRITE,这些值都会写入HKCU / Software / WOW6432Node / companyABC / app.精细.

然后,我有一个C#应用程序尝试读取这些值.使用Microsoft.Win32.Registry,我打开子项(“ HKCU / Software / CompanyABC / app”),但看不到我的值.原来,我看到了以下行为:

>从HKLM读取/写入注册表项时,这些东西都可以使用. python应用程序将写入HKLM / Softare / Wow6432Node / CompanyABC / app,并且C#代码将从该位置读取.鉴于我们如何构建C#应用程序并通过python编写注册表值,这一切也都应有其道理
>从HKCU读取/写入注册表值,我得到了不同的行为. _winreg函数将写入HKCU / Sofrware / Wow6432Node / CompanyABC / app,但C#应用程序将从HKCU / Software / CompanyABC / app读取. C#应用程序是作为x86应用程序构建的(不是任何CPU也不是x64),因此我认为该应用程序将正确重定向到wow6432Node,但似乎没有.

经过一番调查后,HKCU /软件似乎有所不同. This文章似乎表明此区域是“共享的”并且未重定向.如果真是这样,那么我不明白为什么我们的python应用程序(再次使用_winreg)正在写入使用Wow6432Node的HKCU中的某个位置-似乎应该在没有适当重定向的情况下编写它.我想这可能是in_winreg中的错误.

我真的想避免在我们的工具中显式地使用WOW6432Node,但这就是我今天要面对的问题.谁能向我解释如何使32位和64位进程对HKCU的注册表访问正常工作,而不必求助于进入32位配置单元的硬编码路径?

最佳答案
我从关于该问题的评论中了解到,此问题已消失,对于遇到此问题的其他任何人,您都可以使用Microsoft.Win32.OpenBaseKey指定在64位计算机上运行时是打开注册表的64位还是32位部分即使您的进程作为32位进程运行.

如果您始终要访问注册表的NON-WOW6432Node部分中的键,则可以将OpenBaseKey的View参数安全地设置为RegistryView.Registry64.这将在64位和32位操作系统上正常工作.

转载注明原文:我为什么不能在64位计算机上的HKCU中正确读取32位注册表值? - 代码日志