首页 >后端开发 >C++ >如何从 32 位应用程序访问 64 位和 32 位注册表项?

如何从 32 位应用程序访问 64 位和 32 位注册表项?

Linda Hamilton
Linda Hamilton原创
2025-01-16 19:07:10547浏览

How to Access 64-Bit and 32-Bit Registry Keys from a 32-Bit Application?

从 32 位应用程序访问 64 位注册表

感谢 WOW64(Windows on Windows 64 位),32 位应用程序可以访问 64 位注册表。 该子系统有助于在 32 位环境中进行 64 位访问。

访问 64 位注册表项

使用RegistryView.Registry64访问64位注册表:

<code class="language-csharp">using Microsoft.Win32;

string value64 = string.Empty;
RegistryKey localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
localKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey != null)
{
    value64 = localKey.GetValue("RegisteredOrganization").ToString();
    localKey.Close();
}
Console.WriteLine($"RegisteredOrganization [64-bit]: {value64}");</code>

访问 32 位注册表项

使用RegistryView.Registry32访问32位注册表:

<code class="language-csharp">string value32 = string.Empty;
RegistryKey localKey32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
localKey32 = localKey32.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
if (localKey32 != null)
{
    value32 = localKey32.GetValue("RegisteredOrganization").ToString();
    localKey32.Close();
}
Console.WriteLine($"RegisteredOrganization [32-bit]: {value32}");</code>

重要注意事项:WOW64、注册表路径和键查询

  • 在 64 位 Windows 上,HKEY_LOCAL_MACHINESoftwareWow6432Node 保存 32 位应用程序使用的值。
  • 由于 WOW64 重定向,32 位和 64 位应用程序都可以按预期访问 HKEY_LOCAL_MACHINESoftware
  • HKEY_LOCAL_MACHINESoftwareWow6432Node 在旧版 Windows 版本和 32 位 Windows 7 中不存在。

要从 64 位和 32 位注册表中检索值(对于检索 SQL 实例名称等场景很有用),建议使用联合查询:

<code class="language-csharp">public static IEnumerable<string> GetAllRegValueNames(string regPath, RegistryHive hive = RegistryHive.LocalMachine)
{
    var reg64 = GetRegValueNames(RegistryView.Registry64, regPath, hive);
    var reg32 = GetRegValueNames(RegistryView.Registry32, regPath, hive);
    var result = (reg64 != null && reg32 != null) ? reg64.Union(reg32) : (reg64 ?? reg32);
    return (result ?? new List<string>().AsEnumerable()).OrderBy(x => x);
}</code>

这提供了注册表值的统一视图,无论应用程序的体系结构如何。

以上是如何从 32 位应用程序访问 64 位和 32 位注册表项?的详细内容。更多信息请关注PHP中文网其他相关文章!

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