Heim >Backend-Entwicklung >C++ >Warum kann meine 32-Bit-Anwendung nicht auf den 64-Bit-Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall zugreifen?

Warum kann meine 32-Bit-Anwendung nicht auf den 64-Bit-Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall zugreifen?

DDD
DDDOriginal
2025-01-05 16:19:41194Durchsuche

Why Can't My 32-bit Application Access the 64-bit Registry Key HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall?

Registrierungsschlüssel kann in OpenSubKey() nicht geöffnet werden

Beim Versuch, Anzeigenamen für Unterschlüssel innerhalb des Registrierungsschlüssels HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall mithilfe des Codes abzurufen :

RegistryKey newKey;
string val;

string KeyPath64Bit = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
RegistryKey mainKey = Registry.LocalMachine.OpenSubKey(KeyPath64Bit);

string[] RegKeys64Bits = Registry.LocalMachine.OpenSubKey(KeyPath64Bit).GetSubKeyNames();

foreach (string s in RegKeys64Bits)
{
   newKey = mainKey.OpenSubKey(s);
   val = newKey.GetValue("DisplayName", -1, RegistryValueOptions.None).ToString();
   if (val != "-1")
      file64.WriteLine(val);
}

Ein bestimmter Unterschlüssel, {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} bleibt schwer zu fassen. Stattdessen gibt GetSubKeyNames() {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757 zurück, einen Unterschlüssel, dem ein Anzeigename fehlt.

Ursache:

Auf einem 64-Bit-Betriebssystem, eine 32-Bit-Anwendung von Standardmäßig wird auf den Registrierungsschlüssel HKLMSoftwareWow6432Node zugegriffen. Um die 64-Bit-Version des Schlüssels abzurufen, der den gewünschten Unterschlüssel enthält, müssen Sie RegistryView.Registry64 angeben.

Lösung:

In .NET 4.0 und höher Sie können den 64-Bit-Registrierungsschlüssel mithilfe der RegistryView-Eigenschaft öffnen:

using (var hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
using (var key = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
{
   // key now points to the 64-bit key
}

Für .NET 3.5 können Sie P/Invoke verwenden, um auf 64-Bit-Schlüssel zuzugreifen. Detaillierte Anweisungen finden Sie in der Dokumentation unter dem folgenden Link:

http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a- 32-Bit-Anwendung oder umgekehrt/

Das obige ist der detaillierte Inhalt vonWarum kann meine 32-Bit-Anwendung nicht auf den 64-Bit-Registrierungsschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn