2011-11-21 30 views
9

我被困在一个Windows 7注册表问题上,虽然各种问题和答案让我有一些方式,但我见过的没有解决我的特定问题。我不知道其他的Windows版本是否会影响这个问题,但我们都有win7x64机器。为什么我无法在64位机器上正确读取HKCU中的32位注册表值?

在我们的工作中,我们有各种各样的工具,一些C++,一些C#,一些Python(2.6)等。我们也运行32位和64位工具的混合。过去,我们很高兴地在HKLM中存储注册表信息。我们一直在努力把东西搬到HKCU。我们已经讨论过是否这样做,对UAC产生影响等。我们真的想尝试做这个动作。这就是说:

我们无法从HKCU/software/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 /软件是不同的。文章似乎表明这个区域是“共享”的而不是重定向的。如果是这种情况,那么我不明白为什么我们的python应用程序(再次使用_winreg)写入到使用Wow6432Node的HKCU中的某个位置 - 似乎应该在没有重定向的情况下写入它。我想这可能是_winreg中的一个错误。

我真的想避免在WOW6432Node上直接粘贴我们的工具,但这就是我今天所处的位置。任何人都可以向我解释我怎样才能使32位和64位进程的注册表访问正确地进入HKCU,而无需使用硬编码路径进入32位配置单元?

+0

当我第一次切换到Windows Vista时,整个注册表虚拟化系统(在32/64位问题上)使我决定再也不要使用注册表。我知道这可能是不可能的,但如果你可以切换到别的东西(例如配置文件),我强烈建议这样做。 –

+0

无法重现此操作。对我来说,Python 2.6。6(32位和64位)在Windows 7 64位读/写HKCU/Software/companyABC /应用程序按预期方式(不是HKCU /软件/ WOW6432Node/companyABC /应用程序)。 – cgohlke

+0

谢谢cgohlke。我会再看看这里发生了什么。我很欣赏后续。 – Mark

回答

4

我从对问题的评论中了解到,对于遇到此问题的其他人,您可以使用Microsoft.Win32.OpenBaseKey来指定在运行即使您的进程以32位进程运行,也是64位计算机。

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

相关问题