2014-10-28 7 views
9

Ich mache eine Software in C# und MATLAB, die eine andere Software (CMG) aufruft, um etwas zu verarbeiten. Mein Problem ist, dass die Adresse der Software, die ich in mein Programm geschrieben habe, nur auf meinem PC korrekt ist und nicht auf den Computern der Kunden (ich weiß nicht, wie der Weg zur CMG-Software auf ihrem Computer aussehen würde).Suchen, ob Software von Drittanbietern installiert ist, den Installationspfad und den Namen der EXE?

Wie kann ich eine allgemeine Form der Adresse angeben, damit sie auf jedem Computer funktioniert?

Im Folgenden ist der Weg, den ich aus meiner MATLAB-Software nennen:

C:\Program Files (x86)\CMG\STARS\2011.10\Win_x64\EXE\st201110.exe 

Wie Sie es in Laufwerk C zu sehen ist und die Version 2011.10. Wenn also die Version des Kunden etwas anderes ist und auf anderen Laufwerken installiert ist, ergibt dieser Pfad keinen Sinn.

+0

Es sollte einen Weg geben, um diese Informationen aus der Registrierung zu bekommen, aber ich bin mir nicht sicher, wie genau Sie sie bekommen. –

+3

können Sie auch einen ['uigetfile'] (http://www.mathworks.com/help/matlab/ref/uigetfile.html) Dialog (oder den entsprechenden Eintrag in C#) anzeigen, um den Benutzer aufzufordern, den" CMG "auszuwählen ausführbar selbst. – Amro

+0

wie für die Registrierung Idee, das ist anwendungsspezifisch, aber Sie könnten diese Frage auschecken: http://Stackoverflow.com/q/429738/97160 – Amro

Antwort

16

Methode 1

Die Registrierungsschlüssel SOFTWARE \ Microsoft \ Windows \ Currentversion \ Uninstall stellt eine Liste von wo meisten Anwendungen installiert sind:

enter image description here

Hinweis: Es spielt keine‘ t listet alle EXE-Anwendungen auf dem PC auf, da einige nicht installiert werden müssen.

In Ihrem Fall bin ich ziemlich sicher, dass CMG STARS aufgeführt werden, und Sie werden danach suchen können, indem alle Unterschlüssel am Display Wert suchen iterieren und Abrufen des INSTALL.

Beachten Sie auch, dass diese Uninstall Registrierungsschlüssel in 3 Plätze in der Registrierung vorhanden:
1. SOFTWARE \ Microsoft \ Windows \ Currentversion \ Uninstall innerhalb Current
2. SOFTWARE \ Microsoft \ Windows \ Currentversion \ Uninstall innerhalb Localmachine
3. SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ Currentversion \ Uninstall in Localmachine

Dies ist eine Klasse, die den Installationsort einer Anwendung zurückgibt:

using Microsoft.Win32; 

public static class InstalledApplications 
{ 
    public static string GetApplictionInstallPath(string nameOfAppToFind) 
    { 
     string installedPath; 
     string keyName; 

     // search in: CurrentUser 
     keyName = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
     installedPath = ExistsInSubKey(Registry.CurrentUser, keyName, "DisplayName", nameOfAppToFind); 
     if (!string.IsNullOrEmpty(installedPath)) 
     { 
      return installedPath; 
     } 

     // search in: LocalMachine_32 
     keyName = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 
     installedPath = ExistsInSubKey(Registry.LocalMachine, keyName, "DisplayName", nameOfAppToFind); 
     if (!string.IsNullOrEmpty(installedPath)) 
     { 
      return installedPath; 
     } 

     // search in: LocalMachine_64 
     keyName = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; 
     installedPath = ExistsInSubKey(Registry.LocalMachine, keyName, "DisplayName", nameOfAppToFind); 
     if (!string.IsNullOrEmpty(installedPath)) 
     { 
      return installedPath; 
     } 

     return string.Empty; 
    } 

    private static string ExistsInSubKey(RegistryKey root, string subKeyName, string attributeName, string nameOfAppToFind) 
    { 
     RegistryKey subkey; 
     string displayName; 

     using (RegistryKey key = root.OpenSubKey(subKeyName)) 
     { 
      if (key != null) 
      { 
       foreach (string kn in key.GetSubKeyNames()) 
       { 
        using (subkey = key.OpenSubKey(kn)) 
        { 
         displayName = subkey.GetValue(attributeName) as string; 
         if (nameOfAppToFind.Equals(displayName, StringComparison.OrdinalIgnoreCase) == true) 
         { 
          return subkey.GetValue("InstallLocation") as string; 
         } 
        } 
       } 
      } 
     } 
     return string.Empty; 
    } 
} 

REF: Ich habe den obigen Code von here geändert, um den Installationspfad zurückzugeben.


Methode 2

Sie auch die System-Management-Net DLL verwenden können die INSTALL zu bekommen, obwohl es Haufen langsamer ist und erstellt Ereignisprotokollmeldungen für jedes installierte Produkt „Windows Installer die Produkt neu konfiguriert“ auf deinem System.

using System.Management; 

ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); 
foreach (ManagementObject mo in mos.Get()) 
{ 
    Debug.Print(mo["Name"].ToString() + "," + mo["InstallLocation"].ToString() + Environment.NewLine); 
} 

den Namen der EXE Erste

Keines der oben genannten Methoden sagen Sie den Namen der ausführbaren Datei, aber es ist ganz einfach durch Iterieren über alle Dateien im Installationspfad zu erarbeiten und unter Verwendung eine Technik ich diskutiere here to look at file properties die EXE-Datei mit der richtigen Datei Beschreibung, zum Beispiel zu erkennen:

private string GetFileExeNameByFileDescription(string fileDescriptionToFind, string installPath) 
{ 
    string exeName = string.Empty; 
    foreach (string filePath in Directory.GetFiles(installPath, "*.exe")) 
    { 
     string fileDescription = GetSpecificFileProperties(filePath, 34).Replace(Environment.NewLine, string.Empty); 
     if (fileDescription == fileDescriptionToFind) 
     { 
      exeName = GetSpecificFileProperties(filePath, 0).Replace(Environment.NewLine, string.Empty); 
      break; 
     } 
    } 
    return exeName; 
} 

enter image description here


Beide Verfahren (1 oder 2) Sie verwenden empfehle ich, dass Sie den Speicherort exe Namen speichern, so dass Sie nur einmal diese Operation tun. Meiner Meinung nach ist es besser, Methode 1 als schneller zu verwenden und erstellt nicht alle "Windows Installer konfiguriert das Produkt neu." Ereignisprotokolle.


Alternative Methode einen Installer mit

Wenn Ihre Anwendung Ihnen, wo CMG STARS Using Windows Installer to Inventory Products and Patches während der Installation befindet sich herausfinden konnte installiert wird:

Aufzählen Produkte
Verwenden Sie die MsiEnumProductsEx Funktion zum Aufzählen von Windows Installer-Anwendungen, die im System installiert sind. Diese Funktion kann alle pro Rechner installierten Installationen und Benutzerinstallationen von Anwendungen (verwaltet und nicht verwaltet) für den aktuellen Benutzer und andere Benutzer im System finden. Verwenden Sie den Parameter dwContext , um den Installationskontext anzugeben, der gefunden werden soll. Sie können eine beliebige oder eine beliebige Kombination der möglichen Installation Kontexte angeben. Verwenden Sie den Parameter szUserSid, um den Benutzerkontext der zu suchenden Anwendungen anzugeben.

Während der Installation finden Sie den Exe-Pfad zu CMG STARS und speichern Sie einen Registrierungsschlüssel mit dem Wert.

Ich diskutiere mit diesem Ansatz von saving an EXE's install path in the registry for updating applications here.


Tip

Wie in den Kommentaren erwähnt, lohnt es sich, Sie für die EXE-Namen st201110.exe und sehen, ob die Autoren der CMG STAR Anwendung bereits diese in der Registrierung eine Suche zur Verfügung stellen Informationen in einem Registrierungsschlüssel können Sie direkt zugreifen.


Plan B

Wenn alles andere fehlschlägt den Benutzer mit einem FileOpenDialog präsentieren und erhalten sie manuell die EXE-Pfad angeben.


Was passiert, wenn die Drittanbieteranwendung deinstalliert oder aktualisiert wird?

erwähnte ich den Pfad installieren und in der Registry exe Namen zu speichern (oder Datenbank-Konfigurationsdatei, usw.), und Sie sollten die exe-Datei existiert immer überprüfen, bevor Sie alle externen Anrufe, um es zu machen, zum Beispiel:

if (!File.Exists(installPath + exeName)) 
{ 
//Run through the process to establish where the 3rd party application is installed 
} 
+3

+1, das ist eine gründliche Antwort! Wenn das OP diese Erkennung von MATLAB durchführen muss, gibt es entsprechende Funktionen zum Abfragen der Registrierung: http://www.mathworks.com/help/matlab/ref/winqueryreg.html – Amro

+0

@ JeremyThompson Methode # 1 findet, dass die Anwendung ist für mich installiert, aber es gibt keinen 'InstallLocation'-Schlüssel, um die' exe 'zu bekommen. Die 'DisplayIcon'-Taste hat den 'exe'-Pfad, aber ich weiß nicht, ob das zuverlässig ist. – Heinrich

+0

Diese Antwort hängt sehr von der Software ab, die Sie finden möchten - es ist keine universelle Lösung und deshalb schließe ich eine PlanB-Methode ein. Die Verwendung von DisplayIcon sollte in Ordnung sein, wenn das verfügbar ist, und es ist selten, dass Entwickler solche Dinge in ihren Installern ändern. Es ist interessant, dass die App, die Sie finden möchten, das DisplayIcon verwendet. Vielleicht verwenden sie das, um zu verhindern, dass Benutzer das Apps-Icon ändern. –