簡體   English   中英

如何以編程方式獲取另一個應用程序的安裝路徑?

[英]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所述進行查找),或者可能在已安裝程序的卸載部分中,因此您可以檢查:

  • HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Microsoft \\ Windows \\ CurrentVersion \\ Uninstall

但是請注意,任何新版本的安裝都可能更改它寫出的密鑰,無論是用於自定義密鑰還是用於卸載條目。 因此,檢查注冊表可能應該只針對已知的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM