首页 >后端开发 >C++ >为什么 OpenSubKey() 在 64 位系统上无法检索预期的注册表子项?

为什么 OpenSubKey() 在 64 位系统上无法检索预期的注册表子项?

DDD
DDD原创
2025-01-05 11:07:39789浏览

Why Does OpenSubKey() Fail to Retrieve the Expected Registry Subkey on a 64-bit System?

OpenSubKey() 无法从注册表检索所需的子项

尝试检索以下注册表路径中的所有子项显示名称时:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

使用提供的代码,特定子项不是可访问:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}

此子项应显示名称“Microsoft Visual C 2010 x64 Redistributable - 10.0.30319”。但是,GetSubKeyNames() 方法检索不同的子项:

{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757

原因

64 位操作系统上的 32 位应用程序将从 HKLMSoftwareWow6432Node 读取默认节点。要解决此问题并访问密钥的 64 位版本,必须指定RegistryView:

using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
using (var key = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
{
   // key now points to the 64-bit key
}

此 API 是在 .NET 4.0 中引入的。对于 .NET 3.5,需要 P/Invoke:

http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a-32 -位应用程序或反之亦然/

以上是为什么 OpenSubKey() 在 64 位系统上无法检索预期的注册表子项?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn