注册表值访问

本文关键字:访问 注册表 | 更新日期: 2023-09-27 18:17:43

我一直在试图找出为什么我无法访问注册表中的值。我最终有了一个可能的解决方案,但我想知道为什么一个有效而另一个不起作用,如果我可以继续使用这个解决方案。

原始代码:

RegistryKey regKey1 = Registry.LocalMachine.OpenSubKey(regPath);
string regValue1 = (string)regKey1.GetValue("CodeBase");

由于regKey1是null .

一个可能的替代(这个可以):

string regValue2 = (string)Registry.GetValue(Registry.LocalMachine.Name + regPath, "CodeBase", String.Empty);

根据这篇文章,如果程序是为32位编译的,并且在64位机器上运行,应该有一种不同的方式访问注册表。我使用的是64位版本的Windows 7,该程序是为"任何CPU"编译的。然而,如果这是原因,那么我认为上述两种解决方案都失败了。

谁能解释一下这两者的区别?编辑:

发现问题

regPath = @"'SOFTWARE'Wow6432Node'Classes'CLSID' ...";

由于David Heffernan的评论,我将Registry.LocalMachine.Name + regPath更改为Path.Combine(Registry.LocalMachine.Name, regPath),但这并没有开始工作,因为regPath以'''开头(这些项目没有组合-没有例外)。然后我意识到OpenSubKey()也不喜欢开始时的"'"。从regPath中删除这个后,两个版本工作相同。谢谢David,也谢谢你关于使用RegistryView enum的建议。

注册表值访问

版本1

如果键不存在,则regKey1null,对regKey1.GetValue()的调用失败,原因很明显。

如果密钥不存在,则Registry.GetValue()返回null,因此regValue1被赋值为null


关于注册表视图和AnyCPU的问题,你现在是自找麻烦。假设您的意思是查看特定的注册表视图。您应该通过使用RegistryView枚举来明确这一点。