2014-10-28 40 views
9

Tôi đang tạo một phần mềm trong C# và MATLAB gọi một phần mềm khác (CMG) để thực hiện một số xử lý. Vấn đề của tôi là địa chỉ của phần mềm tôi đưa vào chương trình của tôi chỉ đúng trên máy tính cá nhân chứ không phải trên máy tính của khách hàng (tôi không biết đường dẫn tới phần mềm CMG trên máy tính của họ).Tìm xem phần mềm của bên thứ ba có được cài đặt hay không, đường dẫn cài đặt và tên của EXE?

Làm thế nào tôi có thể cung cấp một dạng chung của địa chỉ để làm cho nó hoạt động trên mọi máy tính?

Sau đây là con đường mà tôi gọi từ phần mềm MATLAB của tôi:

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

Như bạn thấy đó là trong ổ C và phiên bản là 2011,10. Vì vậy, nếu phiên bản của khách hàng là một cái gì đó khác và nó được cài đặt trên các ổ đĩa khác, con đường này không có ý nghĩa.

+0

Nên có một cách để có được những thông tin từ sổ đăng ký nhưng tôi không chắc chắn chính xác làm thế nào để có được chúng. –

+3

bạn cũng có thể hiển thị hộp thoại ['uigetfile'] (http://www.mathworks.com/help/matlab/ref/uigetfile.html) (hoặc tương đương trong C#) để nhắc người dùng chọn" CMG " tự thực thi. – Amro

+0

đối với ý tưởng đăng ký, đây là ứng dụng cụ thể nhưng bạn có thể xem câu hỏi này: http://stackoverflow.com/q/429738/97160 – Amro

Trả lời

16

Phương pháp 1

Các phím registry SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall cung cấp một danh sách các nơi nhất các ứng dụng được cài đặt:

enter image description here

Lưu ý: Nó doesn' t liệt kê tất cả các ứng dụng EXE trên PC vì một số không yêu cầu cài đặt.

Trong trường hợp của bạn tôi khá chắc chắn rằng CMG STARS sẽ được liệt kê và bạn sẽ có thể tìm kiếm nó bằng cách duyệt qua tất cả các subkeys nhìn vào DisplayName giá trị và lấy các InstallLocation.

Cũng lưu ý rằng chìa khóa Gỡ bỏ registry này tồn tại ở 3 nơi trong registry:
1. SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall bên CurrentUser
2. SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall bên LocalMachine
3. SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall trong LocalMachine

Dưới đây là một lớp học mà trả về vị trí lắp đặt của một ứng dụng:

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: Tôi đã sửa đổi mã ở trên từ here để trả lại đường dẫn cài đặt.


Phương pháp 2

Bạn cũng có thể sử dụng các hệ thống quản lý Net DLL để có được những InstallLocation mặc dù nó là đống chậm hơn và tạo ra "Windows Installer cấu hình lại các sản phẩm" thông điệp ghi sự kiện cho mỗi sản phẩm được cài đặt trên hệ thống của bạn.

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

Bắt tên của EXE

Cả các phương pháp trên cho bạn biết tên của file thực thi, tuy nhiên nó là khá dễ dàng để tìm ra bằng cách duyệt qua tất cả các file trong đường dẫn cài đặt và sử dụng một kỹ thuật tôi thảo luận here to look at file properties để phát hiện các EXE với đúng file Mô tả, ví dụ:

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


Hoặc phương pháp (1 hoặc 2) bạn sử dụng tôi khuyên bạn lưu vị trí của tên exe vì vậy bạn chỉ thực hiện hành động này một lần. Theo tôi, tốt hơn là sử dụng Phương pháp 1 của nó nhanh hơn và không tạo ra tất cả "Windows Installer đã định cấu hình lại sản phẩm." nhật ký sự kiện.


Phương pháp thay thế việc sử dụng một Installer

Nếu ứng dụng của bạn đang được cài đặt bạn có thể tìm ra nơi CMG STARS nằm trong khi cài đặt Using Windows Installer to Inventory Products and Patches:

liệt kê Sản phẩm
Sử dụng MsiEnumProductsEx chức năng liệt kê các ứng dụng Windows Installer được cài đặt trong hệ thống . Chức năng này có thể tìm thấy tất cả các cài đặt cho mỗi máy và cài đặt ứng dụng cho mỗi người dùng (được quản lý và không được quản lý) cho người dùng hiện tại và người dùng khác trong hệ thống . Sử dụng tham số dwContext để chỉ định ngữ cảnh cài đặt được tìm thấy. Bạn có thể chỉ định bất kỳ một hoặc bất kỳ sự kết hợp nào của các ngữ cảnh có thể cài đặt có thể là . Sử dụng tham số szUserSid để chỉ định ngữ cảnh người dùng của ứng dụng được tìm thấy.

Trong khi cài đặt, bạn sẽ tìm thấy đường dẫn exe tới CMG STARS và lưu khóa đăng ký với giá trị.

Tôi thảo luận sử dụng phương pháp này là saving an EXE's install path in the registry for updating applications here.


Mẹo

Như đã đề cập trong các ý kiến, đó là giá trị bạn thực hiện tìm kiếm trong registry cho tên của EXE st201110.exe và xem nếu các tác giả của ứng dụng CMG STAR đã cung cấp này thông tin trong khóa đăng ký bạn có thể truy cập trực tiếp.


Plan B

Nếu vẫn thất bại hiện cho người dùng với một FileOpenDialog và nhận được chúng để xác định con đường của exe bằng tay.


Điều gì xảy ra nếu ứng dụng của bên thứ ba được gỡ cài đặt hoặc nâng cấp?

tôi đã đề cập để lưu trữ các cài đặt đường dẫn và tên exe trong registry (hoặc cơ sở dữ liệu, tập tin cấu hình, vv) và bạn nên luôn luôn kiểm tra các tập tin exe tồn tại trước khi thực hiện bất kỳ cuộc gọi bên ngoài để nó, ví dụ:

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

+1 đó là câu trả lời kỹ lưỡng! Nếu OP cần thực hiện phát hiện này từ MATLAB, có các hàm tương đương để truy vấn sổ đăng ký: http://www.mathworks.com/help/matlab/ref/winqueryreg.html – Amro

+0

@JeremyThompson Phương pháp # 1 thấy rằng ứng dụng là được cài đặt cho tôi nhưng không có phím 'InstallLocation' để lấy 'exe' từ đó. Phím 'DisplayIcon' có đường dẫn' exe' nhưng tôi không biết liệu nó có đáng tin cậy để sử dụng không? – Heinrich

+0

Câu trả lời này phụ thuộc rất nhiều vào phần mềm bạn đang cố định vị trí - không phải là một kích thước phù hợp với mọi giải pháp và đó là lý do tại sao tôi bao gồm phương pháp planB. Sử dụng DisplayIcon sẽ ổn nếu đó là những gì có sẵn và hiếm khi các nhà phát triển thay đổi loại nội dung đó trong trình cài đặt của họ. Điều thú vị là ứng dụng bạn đang cố gắng tìm thấy sử dụng DisplayIcon, có lẽ họ sử dụng ứng dụng đó để ngăn chặn/cho phép mọi người thay đổi biểu tượng ứng dụng. –

Các vấn đề liên quan