2009-05-02 11 views
8

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

<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 ho aumentare il numero di versione, ecc

Tuttavia, quando tento di ottenere le informazioni sulla versione di questo file chiamando l'API MsiGetFileVersion(), che restituisce l'errore 1006

qui la mia domanda (ERROR_FILE_INVALID file non contiene le informazioni sulla versione.): come (a livello di codice, in C++) recuperare il numero di versione di un file MSI? Oppure, per dirla in un altro modo, dove nel file WiX dovrebbero andare le informazioni sulla versione per poter essere recuperate tramite MsiGetFileVersion()?

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

risposta

6

Solo per completezza, :: MsiGetFileVersion() è una funzione che legge le informazioni sulla versione risorsa da un file PE (EXE o DLL) lo stesso modo in cui il Windows Installer fa. Questo è importante per gli strumenti di compilazione (come lo WiX toolset) da utilizzare in modo che possano popolare correttamente le informazioni su File/@ Version. Non otterrà le informazioni sulla versione da un MSI. Come @sascha mostra puoi interrogare la tabella Proprietà per "ProductVersion" oppure puoi usare :: MsiGetProductProperty() che farà lo stesso.

+2

Vorrei che MSDN docs per MsiGetFileVersion() dica che non sprecherei due ore cercando di farlo funzionare ... –

4

trovato una soluzione: invece di chiamare MsiGetFileVersion(), chiamare:

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

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

MsiCloseHandle(hProduct); 

(la gestione degli errori omesso)

7

Per riferimento, ecco un esempio di VBScript che sto usando nel mio processo di generazione di afferrare tale 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 
+0

Saschabeaunont - Qualsiasi motivo per il doppio 'WScript.Echo getproperty (" ProductVersion ")' 's? – user66001

+0

Inoltre, per coloro che hanno bisogno di più informazioni MSI, dai un'occhiata a questo piccolo gioiello - http://stackoverflow.com/questions/5063129/how-to-find-the-upgrade-code-productcode-of-an-installed -application-in-win-7/17871498 # 17871498 – user66001

Problemi correlati