注册表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();
尝试更改
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位"…
看起来,这是一个安全"特性"。无法访问正在查找该插件的注册表分支。我希望存储在这里的信息需要存储在其他地方。