Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么可以';我不能在64位机器上正确读取HKCU中的32位注册表值吗?_C#_Python_Windows 7_Registry - Fatal编程技术网

C# 为什么可以';我不能在64位机器上正确读取HKCU中的32位注册表值吗?

C# 为什么可以';我不能在64位机器上正确读取HKCU中的32位注册表值吗?,c#,python,windows-7,registry,C#,Python,Windows 7,Registry,我被一个Windows7注册表问题难住了,虽然各种各样的问题和答案让我走到了这一步,但我所看到的一切都没有解决我的特定问题。我不知道其他windows版本是否会影响这个问题,但我们都有win7x64机器 我们在工作中有各种各样的工具,一些C++,一些C语言,一些Python(2.6)等等。我们还运行32和64位工具的混合。过去,我们很乐意将注册表信息存储在HKLM中。我们一直在努力将内容转移到HKCU。我们已经就是否这样做、对UAC的影响等进行了很多讨论。我们真的很想尝试采取这一行动。也就是说:

我被一个Windows7注册表问题难住了,虽然各种各样的问题和答案让我走到了这一步,但我所看到的一切都没有解决我的特定问题。我不知道其他windows版本是否会影响这个问题,但我们都有win7x64机器

我们在工作中有各种各样的工具,一些C++,一些C语言,一些Python(2.6)等等。我们还运行32和64位工具的混合。过去,我们很乐意将注册表信息存储在
HKLM
中。我们一直在努力将内容转移到
HKCU
。我们已经就是否这样做、对UAC的影响等进行了很多讨论。我们真的很想尝试采取这一行动。也就是说:

HKCU/software/CompanyABC/App
读取/写入注册表项时遇到问题。我们有一个用python编写的安装程序
应用程序
,它使用
\u winreg
将注册表项写入上述位置。无论我们是否指定
KEY\u WRITE
|
KEY\u WOW64\u 32KEY
或只指定KEY\u 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读取/写入注册表值,我会得到不同的行为。
    \u winreg
    函数将写入
    HKCU/SOFWARE/Wow6432Node/CompanyABC/app
    ,但C#app将从
    HKCU/Software/CompanyABC/app
    读取。C#应用程序是作为x86应用程序构建的(不是任何CPU,也不是x64),因此我假设该应用程序将正确重定向到
    wow6432Node
    ,但它似乎没有
经过一些调查,似乎香港大学/软件的
有所不同。这篇文章似乎表明这个区域是“共享”的,而不是重定向的。如果是这种情况,那么我无法理解为什么我们的python应用程序(再次使用_winreg)正在写入HKCU中使用
Wow6432Node
的位置-似乎它应该在没有重定向的情况下写入它。我想这可能是
\u winreg
中的一个bug


我真的不想在我们的工具中显式地附加
WOW6432Node
,但这就是我今天要做的。有谁能向我解释一下,我如何能够使从32位和64位进程到
HKCU
的注册表访问正常工作,而不必借助硬编码路径进入32位配置单元?

我从对这个问题的评论中了解到,对于遇到这个问题的任何其他人来说,这个问题已经消失了,您可以使用指定在64位计算机上运行时是打开注册表的64位部分还是32位部分,即使您的进程是作为32位进程运行的


如果您始终希望访问注册表的非WOW6432节点部分中的项,则可以安全地将OpenBaseKey的View参数设置为.Registry64。这在64位和32位操作系统上都能正常工作。

当我第一次切换到Windows Vista时,整个注册表虚拟化系统(32/64位问题之上)让我决定不再使用注册表。我理解这可能是不可能的,但如果您可以切换到其他内容(例如配置文件),我强烈建议您这样做。无法复制此内容。对我来说,Windows7上的Python 2.6.6(32位和64位)64位读/写HKCU/Software/companyABC/app(不是HKCU/Software/WOW6432Node/companyABC/app)。谢谢cgohlke。我再看看这里发生了什么。我很感谢您的后续工作。这听起来像是Python注册表包装中的一个bug。HKCU\软件未重定向。请尝试使用ctypes使用普通win32来确认这一点。看起来像PEBKAC。我进行了测试,看到了我发布的结果。在cgohlke说这个问题是不可复制的之后,我也无法复制它。我去了感恩节,回来后一切都正常了。耸耸肩我不知道我最初的测试发生了什么,但它们显然是错的。