Pregunta

He creado un archivo MSI con WiX. El archivo WiX de origen contiene la información de la versión como esta:

<Product Id="..." 
         Name="..." 
         Language="1033" 
         Version="1.0.0.1" 
         Manufacturer="..." 
         UpgradeCode="...">

El archivo MSI parece funcionar bien: se instala, se desinstala, se actualiza cuando aumenta el número de versión, etc.

Sin embargo, cuando intento obtener la información de versión de este archivo llamando a la API MsiGetFileVersion (), devuelve el error 1006 (ERROR_FILE_INVALID  El archivo no contiene información de la versión.)

De ahí mi pregunta: ¿cómo (mediante programación, en C ++) recuperar el número de versión de un archivo MSI? O, para decirlo de otra manera, ¿dónde debe ir la información de la versión del archivo WiX para poder recuperarse a través de MsiGetFileVersion ()?

Más información: El mismo error ocurre con MSI 3.0 en Windows XP y MSI 4.0 en Vista.

¿Fue útil?

Solución

Solo por motivos de integridad, :: MsiGetFileVersion () es una función que lee la información del recurso de versión de un archivo PE (.exe o .dll) de la misma forma en que lo hace el instalador de Windows. Eso es importante para que las herramientas de compilación (como el conjunto de herramientas de WiX ) se utilicen para que llenen la información del archivo / @ versión correctamente. . No obtendrá la información de la versión de un MSI. Como @sascha muestra, puede consultar la tabla de propiedades para la " ProductVersion " o puede usar el :: MsiGetProductProperty () que hará lo mismo.

Otros consejos

Para referencia, aquí hay un ejemplo de VBscript que estoy usando en mi proceso de compilación para capturarlo antes de crear un boostrapper.

Dim installer, database, view, result

Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("my.msi", 0)

Dim sumInfo  : Set sumInfo = installer.SummaryInformation("my.msi", 0)
sPackageCode =  sumInfo.Property(9) ' PID_REVNUMBER = 9, contains the package code.

WScript.Echo getproperty("ProductVersion")
WScript.Echo getproperty("ProductVersion")
WScript.Echo sPackageCode
WScript.Echo getproperty("ProductName")


Function getproperty(property)

    Set view = database.OpenView ("SELECT Value FROM Property WHERE Property='" & property & "'")
    view.Execute
    Set result = view.Fetch
    getproperty = result.StringData(1)

End Function 

Encontró una solución: en lugar de llamar a MsiGetFileVersion (), llame:

MSIHANDLE hProduct = NULL;
MsiOpenPackage( pszPath, &hProduct );

MsiGetProductProperty( hProduct, _T("ProductVersion"), pszVersion, &dwSizeVersion );

MsiCloseHandle( hProduct );

(manejo de errores omitido)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top