OpenSubKey() 無法從登錄機碼擷取所需的子項
嘗試擷取下列登錄路徑中的所有子項目顯示名稱時:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
使用提供的程式碼,特定子項不是可存取:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}
此子項目應顯示名稱「Microsoft Visual C 2010 x64 Redistributable - 10.0.30319」。但是,GetSubKeyNames() 方法會擷取不同的子項:
{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}.KB2151757
原因
64 位元作業系統上的32 位元應用程式將從HKLMSoftWow6432Node 讀取節點。要解決此問題並存取金鑰的 64 位元版本,必須指定RegistryView:
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 }
此 API 是在 .NET 4.0 中引入的。對於.NET 3.5,需要P/Invoke:
http://www.rhyous.com/2011/01/24/how-read-the-64-bit-registry-from-a-32 -位元應用程式或反之亦然/
以上是為什麼 OpenSubKey() 在 64 位元系統上無法檢索預期的登錄子項目?的詳細內容。更多資訊請關注PHP中文網其他相關文章!