使用OpenSubKey找不到存在的节点

时间:2013-11-13 17:27:08

标签: c# registry

我正在使用cookie切割器代码在C#中获取注册表项对象:

RegistryKey reg = Registry.LocalMachine.OpenSubKey("SOFTWARE\\MyNewKeyName\\");

运行此代码后reg = null。但是,如果我将传递给OpenSubKey的值转换为在SOFTWARE下的其他节点下的注册表中的任何值,reg 现在将具有值< / strong>即可。我已尝试使用此模式的多个键,它可以正常工作。如果我放任何没有其他子节点的任何键名,它就不起作用。最后,我试图在MyNewKeyName内读取字符串值。

如果我的密码下面没有任何其他节点,为什么我的代码不起作用并填充reg

2 个答案:

答案 0 :(得分:4)

事实证明,“32位”注册表和“64位”注册表中的值并不相同。因此,当通过'regedit'查看注册表并查看所有内容时,以编程方式,您可能没有,这就是我遇到的问题。我注意到这一点,运行GetSubKeyNames()并检查返回的密钥。快速回答是检查注册表的两个版本以找到所寻求的值:

    //Check the 64-bit registry for "HKEY_LOCAL_MACHINE\SOFTWARE" 1st:
    RegistryKey localMachineRegistry64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64);
    RegistryKey reg64 = localMachineRegistry64.OpenSubKey(registryKeyLocation, false);

    if (reg64 != null)
    {
        return reg64.GetValue(registryKeyName, true).ToString();
    }

    //Check the 32-bit registry for "HKEY_LOCAL_MACHINE\SOFTWARE" if not found in the 64-bit registry:
    RegistryKey localMachineRegistry32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
    RegistryKey reg32 = localMachineRegistry32.OpenSubKey(registryKeyLocation, false);

    if (reg32 != null)
    {
        return reg32.GetValue(registryKeyName, true).ToString();
    }

答案 1 :(得分:1)

我认为问题是您将其编译为x86而不是将其编译为x64应用程序。请按照以下步骤操作:

  1. 右键单击 Project
  2. 选择属性
  3. 选择构建标签
  4. 将“平台目标”更改为“x64”
  5. 现在运行该项目。