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中文网其他相关文章!