2009-05-02 7 views
8

He creado un archivo MSI con WiX. El archivo fuente de WiX contiene la información de versión de esta manera:Recuperación de la versión de un archivo MSI (creado con WiX)

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

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

Sin embargo, cuando intento para obtener la información sobre la versión de este archivo mediante una llamada al API MsiGetFileVersion(), que devuelve el error 1006

de ahí mi pregunta (ERROR_FILE_INVALID archivo no contiene información de la versión.): cómo (mediante programación, en C++) recuperar el número de versión de un archivo MSI? O, para decirlo de otra manera, ¿en qué parte del archivo WiX debe ir la información de la versión para que se pueda recuperar 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.

Respuesta

6

sólo por el bien integridad, :: MsiGetFileVersion() es una función que lee la información de recurso de versión de un archivo PE (.exe o .dll) la misma manera el instalador de Windows lo hace. Esto es importante para las herramientas de compilación (como WiX toolset) que deben usarse para que llenen correctamente la información de File/@ Version. No obtendrá la información de la versión de una MSI. Como @sascha muestra que puede consultar la tabla de propiedades para la "ProductVersion" o puede usar :: MsiGetProductProperty() que hará lo mismo.

+2

Deseo que los documentos de MSDN para MsiGetFileVersion() digan que no perdería dos horas tratando de hacerlo funcionar ... –

4

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

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

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

MsiCloseHandle(hProduct); 

(manipulación omite error)

7

Como referencia, aquí hay un ejemplo de VBScript que estoy usando en mi proceso de construcción agarrar tales 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 
+0

Saschabeaunont - Cualquier motivo para el doble 'WScript.Echo getproperty (" ProductVersion ")' ¿s? – user66001

+0

Además, para aquellos que necesitan más información de MSI, echen un vistazo a esta pequeña joya: http://stackoverflow.com/questions/5063129/how-to-find-the-code-producto-de-desarrollo-de-un-instalado -application-in-win-7/17871498 # 17871498 – user66001

Cuestiones relacionadas