Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Aplikasi 32-Bit Boleh Mengakses Pendaftaran Windows 64-Bit?
Mengakses Pendaftaran 64-bit daripada Aplikasi 32-bit
Cabaran: Aplikasi 32-bit selalunya memerlukan akses kepada kunci pendaftaran 64-bit—contohnya, untuk mendapatkan butiran contoh SQL Server. Walau bagaimanapun, mereka biasanya hanya mengakses Wow6432Node
cawangan.
Penyelesaian: Windows 7 dan kemudiannya menawarkan sokongan terbina dalam untuk mengakses kekunci pendaftaran 64-bit melalui .NET Framework 4.x atau lebih baru. Kuncinya ialah menggunakan RegistryView
penghitungan:
RegistryView.Registry64
: Mengakses pendaftaran 64-bit.RegistryView.Registry32
: Mengakses pendaftaran 32-bit.Contoh Kod (Akses 64-bit Terus):
Coretan kod ini menunjukkan akses terus kepada pendaftaran 64-bit:
<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>
Pendekatan Lebih Teguh (Fungsi Pembantu):
Untuk fleksibiliti yang lebih besar, fungsi pembantu ini menanyakan kedua-dua pendaftaran 32-bit dan 64-bit, menyatukan hasil:
<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>
Menggunakan Fungsi Pembantu:
Contoh ini menggunakan fungsi pembantu:
<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>
Pendekatan yang dipertingkatkan ini mengendalikan kemungkinan pengecualian dan menyediakan penyelesaian yang lebih mantap untuk mengakses maklumat pendaftaran tanpa mengira seni bina aplikasi atau kunci pendaftaran.
Atas ialah kandungan terperinci Bagaimanakah Aplikasi 32-Bit Boleh Mengakses Pendaftaran Windows 64-Bit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!