.net - Korrekt metode til at få installeret applikationsvej ved app. navn i C #

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger denne funktion til at finde noget installeret program .


Men parameteren 'InstallLocation' virker slet ikke.


Enhver anelse?


Tak!!


void FindApplication(string appName)
{
    StringBuilder sbProductCode = new StringBuilder(39);
    int iIdx = 0;
    while (0 == MsiEnumProducts(iIdx++, sbProductCode))
    {
        Int32 productNameLen = 512;
        StringBuilder sbProductName = new StringBuilder(productNameLen);

        MsiGetProductInfo(sbProductCode.ToString(), "ProductName", sbProductName, ref productNameLen);

        if (sbProductName.ToString().Contains(appName))
        {
             Int32 installDirLen = 2048;
             StringBuilder sbInstallDir = new StringBuilder(installDirLen);
             MsiGetProductInfo(sbProductCode.ToString(),"InstallLocation", sbInstallDir, ref installDirLen);

             string result = string.Format("ProductName {0}: {1}", sbProductName, sbInstallDir);
             }
       }
}

Bedste reference


Jeg har besøgt følgende links, og de synes ikke at være forældede:



  • MsiGetProductInfo funktion

  • Funktionen MsiGetProductInfoEx



De eneste nøgler, jeg ser, der kan bruges, er disse: [4] [5]



  • ARPINSTALLLOCATION

  • INSTALLDIR

  • INSTALLPROPERTY\_INSTALLLOCATION

  • INSTALLLOCATION



Jeg skal påpege, at det fremgår MsiGetProductInfoEx (andet link) bør bruges til at indhente oplysninger om offentliggjorte/installerede produkter tilføjet af en anden bruger; og kræver administrative privedges.

Andre referencer 1


Jeg fandt en anden løsning, og det virker fint.


string FindPathByInstalledAppEXEName(string appEXEName)
{
    string path = string.Empty;

    try
    {
        RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SoftwareMicrosoftInstallerAssemblies");

        string regfilepath = string.Empty;
        if (key != null)  // Make sure there are Assemblies
        {
            foreach (string Keyname in key.GetSubKeyNames())
            {
                if (Keyname.IndexOf(appEXEName) > 0)
                {
                    regfilepath = Keyname;
                    break;
                }
            }
        }

        if (!string.IsNullOrEmpty(regfilepath))
        {
            string fullpath = "";
            for (int a = 0; a < regfilepath.Length; a++)
            {
                if (regfilepath.IndexOf("|", a, 1) > 0)
                    fullpath += "\";
                else
                    fullpath += regfilepath.Substring(a, 1);
            }
            path = fullpath.Substring(0, fullpath.LastIndexOf("\") + 1);
        }
    }
    catch // (Exception ex)
    {
    }

    return path;
}