Search code examples
vb.netregistryuninstallation

How to find a displayversion for a specific installed program in vb.net


I'm trying get a displayversion for a specific program in uninstall registry path. I can get it from a direct path or get the whole uninstall listed, but I cannot get it to find a specific program based on displayname and returns displayversion. Thank you if you can help or provide instruction.

Public Function GetDisplayLink() As String
            On Error Resume Next
            Dim strRegPath As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{772811A3-D34B-4594-AF3E-A7C655013E62}\"
            Dim regVersion64 As Microsoft.Win32.RegistryKey = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, strWorkstation, Microsoft.Win32.RegistryView.Registry64).OpenSubKey(strRegPath)
            Dim strDisplayLink As String = regVersion64.GetValue("DisplayVersion")
            GetDisplayLink = "DisplayLink Driver|" & strDisplayLink & "<BR>"
            regVersion64 = Nothing
        End Function

Solution

  • I cannot get it to find a specific program based on displayname and returns displayversion.

    There are several ways (WMI, Shell, Msi, ...)

    WMI is the simplest one but slow

    A sample with Msi, test with "Microsoft Silverlight" on Windows 10 =>

    Dim sProductName As String = "Microsoft Silverlight"
    Dim nResult As UInteger = 0
    Dim sProductCode As StringBuilder = New StringBuilder(256)
    Dim nIndex As Integer = 0
    Do While (True)
        nResult = MsiEnumProducts(nIndex, sProductCode)
        If (nResult <> 0) Then
            Exit Do
        End If
        Dim nSize As Integer = 256
        Dim sbProductName As StringBuilder = New StringBuilder(nSize)
        nResult = MsiGetProductInfo(sProductCode.ToString(), "InstalledProductName", sbProductName, nSize)
        If (sbProductName.ToString() = sProductName) Then
            nSize = 256
            Dim sbVersionString As StringBuilder = New StringBuilder(nSize)
            nResult = MsiGetProductInfo(sProductCode.ToString(), "VersionString", sbVersionString, nSize)
    
            Console.WriteLine("Product: {0}", sProductName)
            Console.WriteLine(vbTab + "Code: {0}", sProductCode.ToString())
            Console.WriteLine(vbTab + "Version: {0}", sbVersionString.ToString())
            Exit Do
        End If
        nIndex += 1
    Loop
    

    With declarations :

    <DllImport("Msi.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
    Public Shared Function MsiEnumProducts(iProductIndex As Integer, lpProductBuf As StringBuilder) As UInteger
    End Function
    
    <DllImport("Msi.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
    Public Shared Function MsiGetProductInfo(szProduct As String, szAttribute As String, lpValueBuf As StringBuilder, ByRef pcchValueBuf As Integer) As UInteger
    End Function