Question

J'ai créé un fichier MSI avec WiX. Le fichier source WiX contient les informations de version suivantes:

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

Le fichier MSI semble fonctionner correctement: il installe, désinstalle, se met à niveau lorsque j'augmente le numéro de version, etc.

Cependant, lorsque je tente d'obtenir les informations de version sur ce fichier en appelant l'API MsiGetFileVersion (), l'erreur 1006 (ERROR_FILE_INVALID) est renvoyée.  Le fichier ne contient pas d’information sur la version.)

D'où ma question: comment récupérer (par programme, en C ++) le numéro de version d'un fichier MSI? Ou, pour le dire autrement, où dans le fichier WiX les informations de version doivent-elles aller pour pouvoir être récupérées via MsiGetFileVersion ()?

Plus d'informations: la même erreur se produit avec MSI 3.0 sous Windows XP et MSI 4.0 sous Vista.

Était-ce utile?

La solution

Par souci d'exhaustivité, :: MsiGetFileVersion () est une fonction qui lit les informations de ressource de version dans un fichier PE (.exe ou .dll) de la même manière que le programme d'installation de Windows. C’est important pour que les outils de construction (tels que le ensemble d’outils WiX ) soient utilisés afin de renseigner correctement les informations Fichier / @ Version. . Les informations de version ne seront pas extraites d'un fichier MSI. Comme @sascha le montre, vous pouvez interroger la table des propriétés pour le " ProductVersion " ou vous pouvez utiliser le :: MsiGetProductProperty () qui fera de même.

Autres conseils

Pour référence, voici un exemple VBScript que j'utilise dans mon processus de construction pour le récupérer avant de créer 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 

Solution trouvée: au lieu d'appeler MsiGetFileVersion (), appelez:

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

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

MsiCloseHandle( hProduct );

(traitement des erreurs omis)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top