注册表值访问
本文关键字:访问 注册表 | 更新日期: 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
如果键不存在,则regKey1
为null
,对regKey1.GetValue()
的调用失败,原因很明显。
如果密钥不存在,则Registry.GetValue()
返回null
,因此regValue1
被赋值为null
。
关于注册表视图和AnyCPU的问题,你现在是自找麻烦。假设您的意思是查看特定的注册表视图。您应该通过使用RegistryView
枚举来明确这一点。