2017-06-05 29 views
0

我正在準備一個Windows窗體應用程序,它將顯示當前安裝的Office的位數(2016)。我已經在我的表單中放置了一個Button(ChkBtn)和一個Label(BitnessLbl),這將有助於完成我的任務。 問題是,即使我可以通過在註冊機構中搜索找到'Bitness'('x64')的值,但程序無法找到指定的註冊機構。我添加了一個圖像,可以進一步解釋我的問題。而我使用的代碼如下如何從LOCAL_MACHINE的註冊表中讀取

using System; 
using System.Windows.Forms; 
using Microsoft.Win32; 

namespace GetOfficeBitness 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void ChkBtn_Click(object sender, EventArgs e) 
     { 
      var arg = @"SOFTWARE\Microsoft\Office\16.0\Outlook"; 
      var key = Registry.LocalMachine.OpenSubKey(arg, false);//OpenSubKey(arg); 
      /*var p = Registry.LocalMachine.GetSubKeyNames(); 
      var l = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Office\16.0\Common"); 
      var n = l.GetSubKeyNames();*/ 
      if (key != null) 
      { 
       if (key.GetValue("Bitness").ToString() == "x86" || key.GetValue("Bitness").ToString() == "X86") 
        BitnessLbl.Text = @"32 Bit Office"; 
       //Environment.Exit(1); 
      } 
      else 
      { 
       //Environment.Exit(0); 
       BitnessLbl.Text = @"64 Bit Office"; 
      } 

     } 
    } 
} 

圖片鏈接到這裏: - https://i.stack.imgur.com/XUcuX.png

+0

沒有圖像,在代碼中的一些錯誤,請更正。 – pitersmx

+0

https://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.openbasekey(v=vs.110).aspx –

+0

嗨pitersmx,我糾正了錯誤。請檢查... – Izqry

回答

0

正如我在評論,當你的代碼運行表示爲一個32位的過程中,你」重新體驗Registry Redirector的影響。

當它看起來像您的代碼訪問HKEY_LOCAL_MACHINE\Software,它實際上訪問HKEY_LOCAL_MACHINE\Software\Wow6432Node

爲了應對這些影響,請確保使用接受RegistryView並請求64位視圖的適當方法/超載來打開您的密鑰。例如。您可能需要使用OpenBaseKey而不是使用內置的LocalMachine屬性作爲您的起點。

因此,沿着線的東西:

var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine 
           ,RegistryView.Registry64).OpenSubKey(arg, false); 
+0

非常感謝Damien_The_Unbeliever,但是我很抱歉地說,你所建議的一切似乎都讓我感到困惑,我也不是一個在註冊表工作的專業人士。所以,你願意不厭其煩地放下幾個示例代碼行解釋我應該做什麼。 – Izqry

+0

謝謝Damien_The_Unbeliever,拯救我的一天。 :) – Izqry