2017-06-05 80 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