繁体   English   中英

如何从LOCAL_MACHINE下的注册表读取

[英]How to read from Registry under LOCAL_MACHINE

我正在对Windows窗体应用程序进行预配对,该应用程序将显示当前安装的office(2016)的位数。 我在表单中放置了一个Button(ChkBtn)和Label(BitnessLbl),这将有助于完成任务。 问题是,即使我可以通过在注册表中搜索来找到“ Bitness”(在我的情况下为“ x64”)的值,但程序仍无法找到指定的注册表。 我添加了一张图片,可以进一步解释我的问题。 我正在使用的代码如下

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

正如我在评论中指出的那样,当您的代码以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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM