Maison >développement back-end >C++ >Comment les applications 32 bits peuvent-elles accéder au registre Windows 64 bits ?

Comment les applications 32 bits peuvent-elles accéder au registre Windows 64 bits ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-16 18:57:14902parcourir

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

Accès au registre 64 bits à partir d'une application 32 bits

Le défi : Les applications 32 bits ont souvent besoin d'accéder à des clés de registre 64 bits, par exemple pour récupérer les détails de l'instance SQL Server. Cependant, ils n’accèdent généralement qu’à la branche Wow6432Node.

La solution : Windows 7 et versions ultérieures offrent une prise en charge intégrée pour accéder aux clés de registre 64 bits via .NET Framework 4.x ou version ultérieure. La clé utilise l'énumération RegistryView :

  • RegistryView.Registry64 : accède au registre 64 bits.
  • RegistryView.Registry32 : accède au registre 32 bits.

Exemple de code (accès direct 64 bits) :

Cet extrait de code démontre l'accès direct au registre 64 bits :

<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>

Une approche plus robuste (fonctions d'assistance) :

Pour une plus grande flexibilité, ces fonctions d'assistance interrogent les registres 32 bits et 64 bits, consolidant les résultats :

<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>

Utilisation des fonctions d'assistance :

Cet exemple utilise les fonctions d'assistance :

<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>

Cette approche améliorée gère les exceptions potentielles et fournit une solution plus robuste pour accéder aux informations de registre, quelle que soit l'architecture de l'application ou de la clé de registre.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn