[英]How can I get another application's installation path programmatically?
我想知道應用程序的安裝路徑在哪里。 我知道它通常位於... \\ Program Files ...中,但是我猜有些人將其安裝在其他位置。 我知道應用程序的名稱。
謝謝。
查找程序的安裝路徑(在Windows上)的理想方法是從注冊表中讀取它。 大多數安裝程序會為該程序創建一個包含安裝路徑的注冊表項。 該密鑰的確切位置及其名稱取決於所討論的程序。
要查找程序是否在注冊表中具有密鑰,請打開“ regedit ”,然后使用“編輯”>“查找”選項來嘗試查找具有程序名稱的密鑰。 如果存在這樣的密鑰,則可以使用.NET Framework庫中的RegistryKey類讀取它。
如果該程序沒有注冊表項,那么另一個選擇就是要求用戶使用OpenFileDialog查找.exe文件,盡管這顯然不理想。
許多(大多數?)程序創建一個App Paths
注冊表項。 看一下
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
如果您知道有問題的應用程序(與任何應用程序相比),則注冊表項可能是最佳選擇(如果存在)。
安裝程序可能會在某個地方放入自己的自定義“安裝路徑密鑰”(如Fara所述進行查找),或者可能在已安裝程序的卸載部分中,因此您可以檢查:
但是請注意,任何新版本的安裝都可能更改它寫出的密鑰,無論是用於自定義密鑰還是用於卸載條目。 因此,檢查注冊表可能應該只針對已知的install \\ version。
提示
最好的方法是使用Installer API查找程序位置。 您可以通過API編寫托管包裝器
搜索MsiGetProductInfo
參考: http : //msdn.microsoft.com/en-us/library/aa369558(VS.85).aspx
您可以使用MSI(我在這里https://github.com/alialavia/MSINet為其編寫了C#包裝器)。 這是一個簡單的示例:
var location = "";
foreach (var p in InstalledProduct.Enumerate())
{
try
{
if (p.InstalledProductName.Contains("AppName"))
{
location = p.InstallLocation;
break;
}
}
catch { }
}
看一下注冊表。
HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\
要么
HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\
上面的每一個都包含一個子項列表,每個已安裝的應用程序都有一個(例如,在“程序和功能”小程序中顯示)。
您可以在此處搜索您的應用程序,或者如果您知道產品代碼,則直接訪問它。
public string GetInstallPath(string applicationName)
{
var installPath = FindApplicationPath(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", applicationName);
if (installPath == null)
{
installPath = FindApplicationPath(@"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall", applicationName);
}
return installPath;
}
private string FindApplicationPath(string keyPath, string applicationName)
{
var hklm = Registry.LocalMachine;
var uninstall = hklm.OpenSubKey(keyPath);
foreach (var productSubKey in uninstall.GetSubKeyNames())
{
var product = uninstall.OpenSubKey(productSubKey);
var displayName = product.GetValue("DisplayName");
if (displayName != null && displayName.ToString() == applicationName)
{
return product.GetValue("InstallLocation").ToString();
}
}
return null;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.