無法在 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中文網其他相關文章!