代码之家  ›  专栏  ›  技术社区  ›  Alex

如何以编程方式获取其他应用程序的安装路径?

  •  8
  • Alex  · 技术社区  · 14 年前

    我想知道应用程序的安装路径在哪里。我知道它通常在……程序文件中…但我想有些人会把它安装在不同的地方。我知道申请的名字。

    谢谢您。

    6 回复  |  直到 6 年前
        1
  •  12
  •   Alex McBride    14 年前

    找到程序安装路径(在Windows上)的理想方法是从注册表中读取它。大多数安装程序将为包含安装路径的程序创建注册表项。此密钥的确切位置和命名方式因所讨论的程序而异。

    要查找程序在注册表中是否有键,请打开' regedit '并使用“编辑”>查找选项尝试查找具有程序名称的密钥。如果存在这样的密钥,可以使用 RegistryKey .NET框架库中的类。

    如果程序没有注册表项,那么另一个选项就是要求用户使用OpenFileDialog定位.exe文件,尽管这显然不理想。

        2
  •  10
  •   Andreas Rejbrand    14 年前

    很多(大多数?)程序创建一个 App Paths 注册表项。看一看

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths
    
        3
  •  4
  •   Gern Blanston    14 年前

    如果您知道有问题的应用程序(与任何应用程序相比),注册表项可能是最好的选择(如果存在)。

    安装程序可能会将自己的自定义“安装路径密钥”放在某个位置(正如fara提到的那样查找),或者它可能位于已安装程序的卸载部分,因此您可以检查:

    • hkey_local_machine\software\microsoft\windows\currentversion\uninstall

    但请注意,安装的任何新版本都可能更改它所写出的密钥,无论是对于自定义密钥还是对于卸载条目。因此,检查注册表可能只针对已知的安装\版本。

    TEP

        4
  •  3
  •   Sandeep Singh Rawat    14 年前

    最好的方法是使用安装程序API来查找程序位置。 您可以在API上编写托管包装器

    搜索msigetproductinfo

    参考文献: http://msdn.microsoft.com/en-us/library/aa369558(VS.85).aspx

        5
  •  0
  •   Ali Alavi    9 年前

    你可以用MSI(我在这里写了一个C包装纸 https://github.com/alialavia/MSINet )下面是一个简单的例子:

    var location = "";
    foreach (var p in InstalledProduct.Enumerate())
    {
        try
        {
            if (p.InstalledProductName.Contains("AppName"))                     
            {
                location = p.InstallLocation;
                break;
            }
        } 
        catch { }
    }
    
        6
  •  0
  •   komodosp    6 年前

    在注册表中查看一下。

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