ホームページ >バックエンド開発 >C++ >32 ビット アプリケーションはどのようにして 64 ビット Windows レジストリにアクセスできますか?

32 ビット アプリケーションはどのようにして 64 ビット Windows レジストリにアクセスできますか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-16 18:57:14900ブラウズ

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

32 ビット アプリケーションから 64 ビット レジストリへのアクセス

課題: 32 ビット アプリケーションでは、SQL Server インスタンスの詳細を取得するなど、多くの場合 64 ビット レジストリ キーにアクセスする必要があります。 ただし、通常は 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。