1

I have a small subroutine to check for the existence of a required server program, as follows:

      private bool IsProgramInstalled(string programDisplayName)
    {
        string logstr = string.Format("Checking install status of {0}....", programDisplayName);

        RegistryKey rk = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Bridge Club Utilities");
        foreach (string  s in rk.GetSubKeyNames())
        {
            Console.WriteLine(s);
            if (s != null)
            {
                if (s.Equals(programDisplayName))
                {
                    AppendToLog(logstr + " INSTALLED");
                    return true;
                }
            }
        }
        AppendToLog(logstr + " NOT INSTALLED", Color.Red);
        return false;
    }

I have installed the program containing the above subroutine on many Windows boxes with no problems, but one customer receives an 'Unhandled Exception' error on program startup, as shown below: enter image description here

When I loaded VS2022 on the customer's machine and ran it in debug mode, the exception appears on the line that sets RegistryKey rk, as shown below:

enter image description here

So I thought this user had maybe installed the required server program (BridgeComposer) in the wrong place, or the registry was screwed up somehow, or there was a permissions issue. I tried running my app in 'administrative mode', but this did not solve the problem.

Next, I tried to see if the user's PC had the same registry entries as my PC, and it appears that they do. If I manually navigate to 'Computer\HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications' on both machines, I see the same entry for 'BridgeComposer' as shown below:

enter image description here

enter image description here

Clearly I'm doing something wrong/stupid, but I have no clue what it is. Any pointers/clues would be appreciated.

Ken White
  • 123,280
  • 14
  • 225
  • 444
user3765883
  • 233
  • 1
  • 9
  • 1
    Does this answer your question? [Registry.LocalMachine.OpenSubKey() returns null](https://stackoverflow.com/questions/1268715/registry-localmachine-opensubkey-returns-null) – vasek Nov 11 '22 at 01:00

1 Answers1

0

Most likely your program is running as 32-bit on a 64-bit computer and is therefore searching in HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node.

There are a number of ways one can approach this:

  1. Use Registry.OpenBaseKey and specify the desired Registry View.
  2. Compile for AnyCPU, but uncheck Prefer 32-bit (Project => <project name> Properties... => Build => Uncheck Prefer 32-bit)
  3. Compile for 64-bit

Option 1:

Note: The following is untested, but should work - it's a slight modification of the code in your OP.

private bool IsProgramInstalled(string programDisplayName, RegistryView regView = RegistryView.Registry64)
{
    string logstr = string.Format("Checking install status of {0}....", programDisplayName);
    using (RegistryKey localKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, regView))
    {
        if (localKey != null)
        {
            using (RegistryKey rk = localKey.OpenSubKey(@"SOFTWARE\Bridge Club Utilities"))
            {
                if (rk != null)
                {
                    foreach (string s in rk.GetSubKeyNames())
                    {
                        Console.WriteLine(s);
                        if (s != null)
                        {
                            if (s.Equals(programDisplayName))
                            {
                                AppendToLog(logstr + " INSTALLED");
                                return true;
                            }
                        }
                    }
                }
            }
        }
    }

    AppendToLog(logstr + " NOT INSTALLED", Color.Red);
    return false;
}
Tu deschizi eu inchid
  • 4,117
  • 3
  • 13
  • 24
  • This answer got me there, with some help from vasek's link to Registry.LocalMachine.OpenSubKey() returns null. Rather than using RegistryView as an input parameter, I used RegistryView regView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32; – user3765883 Nov 11 '22 at 15:35