为什么我的程序看不到有注册表项?

时间:2018-01-17 15:43:46

标签: c# windows ms-word registry registrykey

我正在尝试检查用户计算机上安装了哪些版本的Word。

这是我正在使用的代码:

    public static bool CheckIfWordVersionIsInstalled(int wordVersion)
    {
        var path32 = "Software\\Microsoft\\Office\\" + WordVersionKeyToValue(wordVersion) + "\\Word\\InstallRoot";
        var path64 = "Software\\Wow6432Node\\Microsoft\\Office\\" + WordVersionKeyToValue(wordVersion) + "\\Word\\InstallRoot";

        var key = Registry.LocalMachine.OpenSubKey(path32, RegistryKeyPermissionCheck.ReadSubTree);   
        Tools.Log("WordTools.CheckIfWordVersionIsInstalled: " + (key != null) + ": " + path32);

        if (key == null)
        {
            key = Registry.LocalMachine.OpenSubKey(path64, RegistryKeyPermissionCheck.ReadSubTree);
            Tools.Log("WordTools.CheckIfWordVersionIsInstalled: " + (key != null) + ": " + path64);
        }

        return key != null;
    }

在我的日志中,我可以看到已经检查过的密钥:

[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Microsoft\Office\16.0\Word\InstallRoot
[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Wow6432Node\Microsoft\Office\16.0\Word\InstallRoot
[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Microsoft\Office\15.0\Word\InstallRoot
[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Wow6432Node\Microsoft\Office\15.0\Word\InstallRoot
[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Microsoft\Office\14.0\Word\InstallRoot
[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Wow6432Node\Microsoft\Office\14.0\Word\InstallRoot
[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Microsoft\Office\12.0\Word\InstallRoot
[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Wow6432Node\Microsoft\Office\12.0\Word\InstallRoot
[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Microsoft\Office\11.0\Word\InstallRoot
[16:36:57]WordTools.CheckIfWordVersionIsInstalled: False: Software\Wow6432Node\Microsoft\Office\11.0\Word\InstallRoot

您可以看到所有这些都返回False。但是当我打开我的注册表时,我可以清楚地看到有一个现有的密钥: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Office \ 16.0 \ Word \ InstallRoot

怎么可能? 我的程序编译为x86(我也试过任何CPU,但结果相同)。 Word也是x86。

1 个答案:

答案 0 :(得分:1)

实际上AnyCPU应该可以正常工作(在64位Windows上)。确保x86不起作用。当您运行32位程序时,对注册表项HKEY_LOCAL_MACHINE\Software的所有访问权限都会自动重定向到HKEY_LOCAL_MACHINE\Software\WOW6432Node,因此您无法从32位应用程序访问HKEY_LOCAL_MACHINE\Software

另见Registry Redirector

除此之外你混合了这条路。 Wow6432Node用于32位,反之亦然。

<强>更新

我的声明“您无法从32位应用程序访问HKEY_LOCAL_MACHINE\Software”并不完全正确。您可以访问它们,但看起来您必须使用API​​调用,但无法通过Registry类直接访问它们,请参阅Accessing an Alternate Registry View