注册表OpenSubkey返回null,尽管它在那里

本文关键字:在那里 OpenSubkey 返回 null 注册表 | 更新日期: 2023-09-27 17:52:57

我已经阅读了关于这个主题的几乎所有其他问题,但它们通常通过在注册表中使用错误的体系结构视图来解决。

我正在尝试打开"…'Outlook'Addins"中的子密钥。我有两个架构可用的子密钥("HKLM'Software…和"HKLM'Software'Wow3264Node…"). 但我知道通过测试,代码正在寻找"WOW6432Node"。

下面是代码片段

var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Default);
var reg = hklm.OpenSubKey(@"Software'Microsoft'Office'Outlook'Addins'MyAddin", false);

我也试过

var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Registry32);
var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Registry64);

来调试它并查找子键,这些子键是可见的,它给了我所有其他条目(甚至是新创建的条目),但不是我正在寻找的条目。

我还检查了注册表权限,这与我看到的其他权限相同。

那么为什么我总是收到null为"reg"?

编辑:也许我应该补充,我正在寻找插件内部的关键。当从一个简短的测试控制台应用程序中尝试它时,我在调用

时看到了子键
reg.GetSubKeyNames();

注册表OpenSubkey返回null,尽管它在那里

尝试更改

var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Default);

var hklm = RegistryKey.OpenBaseKey RegistryHive.LocalMachine,RegistryView.Registry64);

当你在64位操作系统上运行32位应用程序时,它会自动找到Wow6432Node。另一种解决方法可能是为x64架构编译它。

关于RegistryView枚举的更多信息可以在MSDN上找到。注意这一行;

如果在32位操作系统上请求64位视图,返回的键将在32位视图中。

所以你应该总是请求64位密钥。

这让我头疼了大约4个小时,直到我意识到我忘记取消勾选"项目>软件属性"下的"首选32位"…

看起来,这是一个安全"特性"。无法访问正在查找该插件的注册表分支。我希望存储在这里的信息需要存储在其他地方。

相关文章: