2014-10-28 21 views
9

Tworzę oprogramowanie w języku C# i MATLAB, które wywołuje inne oprogramowanie (CMG), aby wykonać pewne przetwarzanie. Moim problemem jest to, że adres oprogramowania, które umieściłem w moim programie, jest poprawny tylko na moim komputerze osobistym, a nie na komputerach klientów (nie wiem, jaka byłaby ścieżka do oprogramowania CMG na ich komputerze).Znajdź, czy zainstalowane jest oprogramowanie osób trzecich, ścieżkę instalacji i nazwę EXE?

Jak mogę podać ogólną formę adresu, aby działał na każdym komputerze?

Poniżej znajduje się ścieżka zadzwonić z mojego oprogramowania MATLAB:

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

Jak widać to na dysku C, a wersja jest 2011,10. Jeśli więc wersja klienta jest czymś innym i jest instalowana na innych dyskach, ta ścieżka nie ma sensu.

+0

Powinien istnieć sposób na uzyskanie tych informacji z rejestru, ale nie jestem pewien, jak je zdobyć. –

+3

można również wyświetlić okno dialogowe ['uigetfile'] (http://www.mathworks.com/help/matlab/ref/uigetfile.html) (lub jego odpowiednik w języku C#), aby zachęcić użytkownika do wybrania" CMG " wykonywać się samodzielnie. – Amro

+0

co do koncepcji rejestru, jest to specyficzne dla aplikacji, ale można sprawdzić to pytanie: http://stackoverflow.com/q/429738/97160 – Amro

Odpowiedz

16

Metoda 1

klucze rejestru SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall zawiera listę gdzie są zainstalowane najbardziej wniosków:

enter image description here

Uwaga: To nie robi” t wypisz wszystkie aplikacje EXE na PC, ponieważ niektóre nie wymagają instalacji.

W twoim przypadku jestem całkiem pewny, że CMG STARS zostaną wymienione i będzie można go wyszukać przez Iterowanie nad wszystkie podklucze patrząc na DisplayName wartości i pobierania InstallLocation.

Należy również pamiętać, że ten klucz rejestru Uninstall istnieje w 3 miejscach w rejestrze:
1. SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall wewnątrz CurrentUser
2. SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall wewnątrz LocalMachine
3. SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall w LocalMachine

Tutaj jest klasa, która zwraca zainstalowany lokalizację aplikacji:

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: Zmodyfikowałem powyższy kod z here, aby zwrócić ścieżkę instalacji.


Metoda 2

Można również użyć zarządzania systemem .NET DLL uzyskać InstallLocation chociaż jest mnóstwo wolniej i tworzy „Instalator Windows rekonfigurowane produkt” Komunikaty dziennika zdarzeń dla każdego zainstalowanego produktu w twoim systemie.

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

Uzyskiwanie nazwa EXE za

Żadna z powyższych metod powiedzieć nazwę pliku wykonywalnego, jednak jest to dość łatwe do pracy przez iteracji po wszystkich plików w katalogu instalacyjnym i stosując technikę omówię here to look at file properties wykryć EXE z odpowiednim Opis pliku, np:

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


metoda Albo (1 lub 2) korzystania I zaleca, aby zapisać lokalizację exe nazwy więc tylko zrobić tę operację raz. Moim zdaniem lepiej użyć metody 1, ponieważ jest ona szybsza i nie tworzy wszystkich "Instalator Windows ponownie skonfigurował produkt". dzienniki zdarzeń.


Alternatywna metoda z użyciem instalatora

Jeśli aplikacja jest instalowana można dowiedzieć się, gdzie CMG STARS znajduje się w trakcie instalacji Using Windows Installer to Inventory Products and Patches:

wyliczanie Produkty
Skorzystaj z MsiEnumProductsEx funkcja do wyliczenia aplikacji Instalatora Windows zainstalowanych w systemie . Ta funkcja może znaleźć wszystkie instalacje na komputerze i instalacje aplikacji (zarządzanej i niezarządzanej) dla poszczególnych użytkowników dla dla każdego użytkownika i innych użytkowników w systemie. Użyj parametru dwContext , aby określić kontekst instalacji, który ma zostać znaleziony. Można podać określić dowolną lub dowolną kombinację możliwych kontekstów instalacji. Parametr szUserSid służy do określania kontekstu użytkownika aplikacji, które można znaleźć.

Podczas instalacji można znaleźć ścieżkę exe do CMG STARS i zapisać klucz rejestru z wartością.

Omawiam stosowanie tego podejścia z saving an EXE's install path in the registry for updating applications here.


Tip

Jak wspomniano w komentarzach, to warto to zrobić wyszukiwania w rejestrze dla nazwy exe st201110.exe i sprawdzić, czy autorzy aplikacji CMG STAR to już zapewnić informacje w kluczu rejestru, do którego można uzyskać bezpośredni dostęp.


Plan B

Jeśli wszystko inne zawiedzie zaprezentować użytkownikowi FileOpenDialog i je ręcznie określić ścieżkę exe.


Co się stanie, jeśli aplikacja innego producenta zostanie odinstalowana lub zaktualizowana?

wspominałem przechowywać ścieżkę i exe nazwę w rejestrze (lub bazę danych, plik konfiguracyjny, etc) zainstalować i zawsze należy sprawdzić plik exe istnieje przed dokonaniem jakichkolwiek połączeń zewnętrznych do niego, np:

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

+1 to dokładna odpowiedź! Jeśli OP musi wykonać to wykrywanie z MATLAB, istnieją równoważne funkcje do sprawdzenia rejestru: http://www.mathworks.com/help/matlab/ref/winqueryreg.html – Amro

+0

@JeremyThompson Metoda nr 1 stwierdza, że ​​aplikacja jest zainstalowany dla mnie, ale nie ma klucza 'InstallLocation', aby uzyskać' exe'. Klucz 'DisplayIcon' ma ścieżkę' exe', ale nie wiem, czy to jest niezawodne w użyciu? – Heinrich

+0

Ta odpowiedź zależy w dużej mierze od oprogramowania, które próbujesz zlokalizować - nie jest to uniwersalne rozwiązanie, dlatego dołączam metodę planB. Korzystanie z DisplayIcon powinno być w porządku, jeśli to jest dostępne i rzadko kiedy programiści zmieniają takie rzeczy w swoich instalatorach. Interesująca jest aplikacja, którą próbujesz znaleźć, używa DisplayIcon, być może używają jej, aby uniemożliwić ludziom zmianę ikony aplikacji. –