alice7
alice7

Reputation: 3884

Reading current installed version of an application using windows api

I was trying to use windows api to find out the version info of an installed application.

I used the upgrade code to find out the product code using MsiEnumRelatedProducts api, but when I try to use MsiGetProductInfo using the product code, the version info comes back as garbage.

Here is my MsiGetProductInfo api:

[DllImport("msi.dll", CharSet = CharSet.Unicode)]
private static extern Int32 MsiGetProductInfo(
    string product, string property, [Out] StringBuilder valueBuf,
    ref Int32 len);

MsiGetProductInfo(sbProductCode, "INSTALLPROPERTY_INSTALLVERSION", builder, ref len);

Any thoughts on what I'm doing wrong?

Upvotes: 3

Views: 3006

Answers (3)

Damon D
Damon D

Reputation: 196

In response to @JoshHetland the string to pass is the CamelCase postfix of the INSTALLPROPERTY_VERSIONSTRING - remember that MSI is case sensitive.

So:

INSTALLPROPERTY_VERSIONSTRING becomes VersionString

INSTALLPROPERTY_INSTALLDATE becomes InstallDate

and so on.

Complete list of properties available is on the MSDN page for the MsiGetProductInfo function .

Upvotes: 3

alice7
alice7

Reputation: 3884

Here is what I did that my solved my problem.

        Int32 m_len = 11512;
        StringBuilder m_versionInfo = new StringBuilder(m_len);

        StringBuilder m_sbProductCode = GetProductCodeFromMsiUpgradeCode();
        MsiGetProductInfo(m_sbProductCode.ToString(), "**VersionString**", m_versionInfo, ref m_len);

        return m_versionInfo.ToString();

This did return me the version string ,and also converted from decimal into string format like 1.4.3.

Upvotes: 2

Erich Horak
Erich Horak

Reputation: 435

Application.ProductVersion works for me, no need to call WinAPI manually (I am still in .Net 1.1 though)

Upvotes: 0

Related Questions