Bueno esta es una pequeña función la cual nos permite obtener información detallada sobre las aplicaciones instaladas utilizando la API del Installer de Window, no es necesario leer ya las entradas del registro para obtener esta información , lo malo es que solo lista las aplicaciones que utiliza el installer , las demás las desecha porque no lo usan. También añadi otro pedazito de code para desinatalar las apliaciones con esa misma API. Bueno saludos y espero que les resulte interesante.
Código [Seleccionar]
Option Explicit
'---------------------------------------------------------------------------------------
' Modulo : mEnumerateInstallerApps
' Autor : skyweb07
' Email : skyweb09@hotmail.es
' Creación : 02/02/2010 12:45
' Próposito : Obtener una lista detallada de las aplicaciones instaladas en window utilizando las apis del Installer.
' Requerimientos : Windows Installer 3.0+
' Créditos : http://msdn.microsoft.com/en-us/library/aa369426%28VS.85%29.aspx
'---------------------------------------------------------------------------------------
' // MSI
Private Declare Function MsiEnumProductsA Lib "MSI.dll" (ByVal iProductIndex As Long, ByVal lpProductBuf As String) As Long
Private Declare Function MsiGetProductInfoA Lib "MSI.dll" (ByVal szProduct As String, ByVal szAttribute As String, ByVal lpValueBuf As String, ByRef pcchValueBuf As Long) As Long
Private Declare Function MsiInstallProductA Lib "MSI.dll" (ByVal szPackagePath As String, ByVal szCommandLine As String) As Long
' // MSI Constantes
Const INSTALLPROPERTY_PRODUCTNAME = "ProductName"
Const INSTALLPROPERTY_PACKAGECODE = "PackageCode"
Const INSTALLPROPERTY_VERSIONSTRING = "VersionString"
Const INSTALLPROPERTY_HELPLINK = "HelpLink"
Const INSTALLPROPERTY_INSTALLLOCATION = "InstallLocation"
Const INSTALLPROPERTY_INSTALLSOURCE = "InstallSource"
Const INSTALLPROPERTY_INSTALLDATE = "InstallDate"
Const INSTALLPROPERTY_PUBLISHER = "Publisher"
Const INSTALLPROPERTY_LOCALPACKAGE = "LocalPackage"
Const ERROR_NO_MORE_ITEMS As Long = 259&
Const ERROR_SUCCESS As Long = 0&
Public Function EnumApplications() As Collection
' // Función para obtener el listado de aplicaciones que estan instaladas
' // utilizando el Installer de window, ojo que las otras aplicaciones que
' // no esten instaladas utilizando el Installer no las va a listar.
Dim vBuffer As String * 39
Dim hGUID As Collection
Dim i As Long
Const Y As String = " - "
Set hGUID = New Collection
Set EnumApplications = New Collection
Do Until MsiEnumProductsA(ByVal i, vBuffer) = ERROR_NO_MORE_ITEMS
hGUID.Add Left$(vBuffer, InStr(1, vBuffer, Chr$(0)) - 1)
i = i + 1
Loop
If hGUID.Count > 0 Then
For i = 1 To hGUID.Count
EnumApplications.Add ProductInfo(hGUID.Item(i), INSTALLPROPERTY_PRODUCTNAME) & Y & ProductInfo(hGUID.Item(i), INSTALLPROPERTY_PUBLISHER) & Y & ProductInfo(hGUID.Item(i), INSTALLPROPERTY_VERSIONSTRING) & Y & ProductInfo(hGUID.Item(i), INSTALLPROPERTY_INSTALLDATE) & Y & ProductInfo(hGUID.Item(i), INSTALLPROPERTY_INSTALLLOCATION) & Y & ProductInfo(hGUID.Item(i), INSTALLPROPERTY_HELPLINK) & Y & ProductInfo(hGUID.Item(i), INSTALLPROPERTY_LOCALPACKAGE) & Y & ProductInfo(hGUID.Item(i), INSTALLPROPERTY_PACKAGECODE)
Next i
End If
End Function
Private Function ProductInfo(hGUID As String, hAttribute As String) As String
' // Función para obtener información acerca de una aplicación deternimada
' // pasandole los parámetros de la GUID de la aplicación y el atributo de
' // la información que se desea obtener.
Dim vBuffer As String * 260
If MsiGetProductInfoA(hGUID, hAttribute, vBuffer, Len(vBuffer)) = ERROR_SUCCESS Then
ProductInfo = Left$(vBuffer, InStr(1, vBuffer, Chr$(0)) - 1)
End If
End Function
Public Function Uninstall(hPath As String) As Long
' // Función para desinstalar un programa utilizando el installer
' // ojo que el valor lo devuelve solo cuando se desinstala el programa
' // o cuando el usuario cancela la instalación
' // Más información aqui : http://msdn.microsoft.com/en-us/library/aa370315%28VS.85%29.aspx
Uninstall = MsiInstallProductA(hPath, "REMOVE=ALL")
End Function