atconway
atconway

Reputation: 21314

Using OpenSubKey not finding node that exists

I am using the cookie cutter code to get a registry key object in C#:

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

After I run this code reg = null. However, if I switch the value passed to OpenSubKey to be any value in the registry under SOFTWARE that has additional nodes below it reg will now have a value. I've tried multiple keys with this pattern and it works. If I put any any key name that does not have additional child nodes it does not work. Ultimately I'm trying to read a string value inside of MyNewKeyName.

Why does my code not work and reg get populated if my key does not have any additional nodes below it?

Upvotes: 3

Views: 1396

Answers (2)

Sudhakar Tillapudi
Sudhakar Tillapudi

Reputation: 26209

I think the problem is you are compiling it as x86 instead of compiling it as an x64 application. Follow the below steps:

  1. Right click on Project
  2. Select Properties
  3. Select the Build tab
  4. Change "Platform Target" to "x64"
  5. Now run the project.

Upvotes: 1

atconway
atconway

Reputation: 21314

Well it turns out that the values in the '32-bit' registry and the '64-bit' registry are not identical. So when viewing the registry via 'regedit' and seeing everything, programatically you may not and that's the issue I was running into. I noticed this by running GetSubKeyNames() and inspecting the keys returned. The quick answer is to check both versions of the registry to find the value sought:

    //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();
    }

Upvotes: 5

Related Questions