无法在 OpenSubKey() 中打开注册表项
尝试检索注册表项 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall 中子项的显示名称时,使用代码:
RegistryKey newKey; string val; string KeyPath64Bit = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; RegistryKey mainKey = Registry.LocalMachine.OpenSubKey(KeyPath64Bit); string[] RegKeys64Bits = Registry.LocalMachine.OpenSubKey(KeyPath64Bit).GetSubKeyNames(); foreach (string s in RegKeys64Bits) { newKey = mainKey.OpenSubKey(s); val = newKey.GetValue("DisplayName", -1, RegistryValueOptions.None).ToString(); if (val != "-1") file64.WriteLine(val); }
一个特定的子项 {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} 仍然难以捉摸。相反,GetSubKeyNames() 返回 {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757,这是一个缺少显示名称的子项。
原因:
在64位操作系统,默认情况下,32 位应用程序访问 HKLMSoftwareWow6432Node 注册表项。要检索包含所需子项的 64 位版本的项,您需要指定RegistryView.Registry64。
解决方案:
在 .NET 4.0 及更高版本中,您可以使用RegistryView属性打开64位注册表项:
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 }
For .NET 3.5 中,您可以利用 P/Invoke 访问 64 位密钥。有关详细说明,请参阅以下链接中的文档:
http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a- 32 位应用程序或反之亦然/
以上是为什么我的 32 位应用程序无法访问 64 位注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall?的详细内容。更多信息请关注PHP中文网其他相关文章!