2016-04-01 5 views
0

Ich schreibe Code, der überprüfen muss, ob ein Programm installiert ist, und wenn ja, den Pfad abrufen. Der Pfad wird entweder in HKEY_LOCAL_MACHINE\SOFTWARE\Some\Registry\Path\InstallLocation oder HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Some\Registry\Path\InstallLocation gespeichert, abhängig davon, ob die 32-Bit- oder 64-Bit-Version des Programms installiert ist.Überprüfen von Werten in 32-Bit- und 64-Bit-Registrys von x64-Anwendung?

Der Code, den ich jetzt haben den Weg für eine 32-Bit-Installation zu finden, schlägt fehl, wenn auf einem 64-Bit-Maschine ausgeführt wird:

 const string topKeyPath = @"HKEY_LOCAL_MACHINE\SOFTWARE"; 
     const string subLocationPath = @"Some\Registry\Path\InstallLocation"; 

     object pathObj = Registry.GetValue(topKeyPath + @"\" + subLocationPath, null, null); 

     if (pathObj == null) // if 32-bit isn't installed, try to find 64-bit 
     { 
      try 
      { 
       RegistryKey view32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32); 
       view32 = view32.OpenSubKey("SOFTWARE"); 
       view32 = view32.OpenSubKey(subLocationPath); 

       pathObj = view32.OpenSubKey(subLocationPath, false).GetValue(null); 

       if (pathObj == null) 
       { 
        throw new InvalidOperationException("Not installed."); 
       } 
      } 
      catch (Exception e) 
      { 
       throw new InvalidOperationException("Not installed.", e); 
      } 
     } 

     string installPath = Convert.ToString(pathObj); 
+0

Ist Ihnen App für AnyCPU Zielplattform kompiliert (ohne 32-Bit-Flag Bevorzugen)? – Steve

+0

Mein Testcode ist für AnyCPU kompiliert, aber ich bin nicht sicher, auf welche Kombinationen die eventuelle Software zielt. – Benjin

Antwort

1

ich dieses Problem gelöst durch meinen Code in etwas sauberer und logische Refactoring .

 string installPath = GetInstallLocation(RegistryView.Default); // try matching architecture 

     if (installPath == null) 
     { 
      installPath = GetInstallLocation(RegistryView.Registry64); // explicitly try for 64-bit 
     } 

     if (installPath == null) 
     { 
      installPath = GetInstallLocation(RegistryView.Registry32); // explicitly try for 32-bit 
     } 

     if (installPath == null) // must not be installed 
     { 
      throw new InvalidOperationException("Program is not instlaled."); 
     } 

public static string GetInstallLocation(RegistryView flavor) 
    { 

     const string subLocationPath = @"SOFTWARE\Microsoft\Some\Registry\Path\InstallLocation"; 
     object pathObj; 

     try 
     { 
      RegistryKey view32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, flavor); 
      view32 = view32.OpenSubKey(subLocationPath); 

      pathObj = view32.GetValue(null); 

      return pathObj != null ? Convert.ToString(pathObj) : null; 
     } 
     catch (Exception) 
     { 
      return null; 
     } 
    }