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:
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;
}
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
}
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. –
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
đố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