我正在尝试检查用户计算机上安装了哪些版本的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。
答案 0 :(得分:1)
实际上AnyCPU
应该可以正常工作(在64位Windows上)。确保x86
不起作用。当您运行32位程序时,对注册表项HKEY_LOCAL_MACHINE\Software
的所有访问权限都会自动重定向到HKEY_LOCAL_MACHINE\Software\WOW6432Node
,因此您无法从32位应用程序访问HKEY_LOCAL_MACHINE\Software
。
除此之外你混合了这条路。 Wow6432Node
用于32位,反之亦然。
<强>更新强>
我的声明“您无法从32位应用程序访问HKEY_LOCAL_MACHINE\Software
”并不完全正确。您可以访问它们,但看起来您必须使用API调用,但无法通过Registry
类直接访问它们,请参阅Accessing an Alternate Registry View