首页 > 后端开发 > C++ > 为什么我的 32 位应用程序无法访问 64 位注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall?

为什么我的 32 位应用程序无法访问 64 位注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall?

DDD
发布: 2025-01-05 16:19:41
原创
184 人浏览过

Why Can't My 32-bit Application Access the 64-bit Registry Key HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板