Domanda

Ho creato un file MSI con WiX. Il file WiX di origine contiene le informazioni sulla versione in questo modo:

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

Il file MSI sembra funzionare bene: si installa, si disinstalla, si aggiorna quando aumento il numero di versione, ecc.

Tuttavia, quando tento di ottenere le informazioni sulla versione di questo file chiamando l'API MsiGetFileVersion (), viene restituito l'errore 1006 (ERROR_FILE_INVALID  Il file non contiene informazioni sulla versione.)

Da qui la mia domanda: come (a livello di codice, in C ++) recuperare il numero di versione di un file MSI? O, per dirla in altro modo, dove nel file WiX dovrebbero andare le informazioni sulla versione per essere recuperabili tramite MsiGetFileVersion ()?

Ulteriori informazioni: lo stesso errore si verifica con MSI 3.0 su Windows XP e MSI 4.0 su Vista.

È stato utile?

Soluzione

Solo per completezza, :: MsiGetFileVersion () è una funzione che legge le informazioni sulla risorsa versione da un file PE (.exe o .dll) allo stesso modo stesso di Windows Installer. Ciò è importante per gli strumenti di compilazione (come il set di strumenti WiX ) da utilizzare in modo da popolare correttamente le informazioni File / @ Version . Non otterrai le informazioni sulla versione da un MSI. Come mostra @sascha, è possibile eseguire una query nella tabella Proprietà per " ProductVersion " oppure potresti usare :: MsiGetProductProperty () che farà lo stesso.

Altri suggerimenti

Per riferimento, ecco un esempio di VBscript che sto usando nel mio processo di compilazione per afferrarlo prima di creare 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 

Trovato una soluzione: invece di chiamare MsiGetFileVersion (), chiama:

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

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

MsiCloseHandle( hProduct );

(gestione degli errori omessa)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top