首頁 > 後端開發 > C++ > 為什麼我的 32 位元應用程式無法存取 64 位元登錄機碼 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall?

為什麼我的 32 位元應用程式無法存取 64 位元登錄機碼 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall?

DDD
發布: 2025-01-05 16:19:41
原創
178 人瀏覽過

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

無法在 OpenSubKey() 中開啟登錄機碼

嘗試擷取登錄機碼 HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoftCurrentVersionUninstall中子項的顯示名稱時,使用代碼:

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);
}
登入後複製

一個特定的子項 {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E} 仍然難以捉摸。相反,GetSubKeyNames() 傳回 {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757,這是一個缺少顯示名稱的子項目。

原因:

在64位元作業系統,預設情況下,32 位元應用程式存取 HKLMSoftwareWow6432Node 註冊表項。若要檢索包含所需子項的 64 位元版本的項,您需要指定RegistryView.Registry64。

解決方案:

在.NET 4.0 及更高版本中,您可以使用RegistryView屬性開啟64位元註冊表項:

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
}
登入後複製

For .NET 3.5 中,您可以利用P/Invoke 存取64 位元金鑰。有關詳細說明,請參閱以下連結中的文件:

http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a- 32 位元應用程式或反之亦然/

以上是為什麼我的 32 位元應用程式無法存取 64 位元登錄機碼 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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