首頁 > 後端開發 > C++ > 32位元應用程式如何存取64位元Windows註冊表?

32位元應用程式如何存取64位元Windows註冊表?

Patricia Arquette
發布: 2025-01-16 18:57:14
原創
902 人瀏覽過

How Can 32-Bit Applications Access the 64-Bit Windows Registry?

從 32 位元應用程式存取 64 位元註冊表

挑戰:32 位元應用程式通常需要存取 64 位元登錄項,例如,擷取 SQL Server 執行個體詳細資訊。 但是,他們通常只訪問 Wow6432Node 分支。

解決方案:Windows 7 及更高版本提供透過 .NET Framework 4.x 或更高版本存取 64 位元登錄項目的內建支援。 關鍵是使用 RegistryView 列舉:

  • RegistryView.Registry64:存取 64 位元註冊表。
  • RegistryView.Registry32:存取 32 位元註冊表。

程式碼範例(直接 ​​64 位元存取):

此程式碼片段示範了對 64 位元註冊表的直接存取:

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

RegistryKey localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
RegistryKey sqlServerKey = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL");
string sqlExpressKeyName = (string)sqlServerKey.GetValue("SQLEXPRESS"); </code>
登入後複製

更穩健的方法(輔助函數):

為了獲得更大的靈活性,這些輔助函數查詢 32 位元和 64 位元註冊表,合併結果:

<code class="language-csharp">using Microsoft.Win32;
using System.Collections.Generic;
using System.Linq;

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);
}

public static object GetRegValue(string RegPath, string ValueName = "", RegistryHive hive = RegistryHive.LocalMachine)
{
    return GetRegValue(RegistryView.Registry64, RegPath, ValueName, hive) ?? GetRegValue(RegistryView.Registry32, RegPath, ValueName, hive);
}

private static IEnumerable<string> GetRegValueNames(RegistryView view, string regPath, RegistryHive hive)
{
    try
    {
        using (var key = RegistryKey.OpenBaseKey(hive, view).OpenSubKey(regPath))
        {
            return key?.GetValueNames();
        }
    }
    catch (Exception) { return null; }
}

private static object GetRegValue(RegistryView view, string regPath, string valueName, RegistryHive hive)
{
    try
    {
        using (var key = RegistryKey.OpenBaseKey(hive, view).OpenSubKey(regPath))
        {
            return key?.GetValue(valueName);
        }
    }
    catch (Exception) { return null; }
}</code>
登入後複製

使用輔助函數:

此範例使用輔助函數:

<code class="language-csharp">var sqlRegPath = @"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL";
foreach (var valueName in GetAllRegValueNames(sqlRegPath))
{
    var value = GetRegValue(sqlRegPath, valueName);
    Console.WriteLine($"{valueName}={value}");
}</code>
登入後複製

這種改進的方法可以處理潛在的異常,並提供更強大的解決方案來訪問註冊表信息,無論應用程式或註冊表項的體系結構如何。

以上是32位元應用程式如何存取64位元Windows註冊表?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板