Frage

Ich habe eine MSI-Datei mit WiX.Die Quelle WiX-Datei enthält die version mit den folgenden Informationen:

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

Die MSI-Datei scheint zu funktionieren OK:es wird installiert, deinstalliert, aktualisiert, wenn ich erhöhen Sie die Versionsnummer, etc.

Allerdings, wenn ich versuche zu bekommen, die version die Informationen über diese Datei durch den Aufruf der MsiGetFileVersion () - API, es gibt Fehler 1006 (ERROR_FILE_INVALID Die Datei enthält keine Versionsinformationen.)

Daher meine Frage:wie (programmgesteuert in C++) abrufen der Versionsnummer eine MSI-Datei?Oder, um es anders zu sagen, wo in der WiX-Datei sollte die version Informationen gehen in Ordnung zu sein abrufbar über MsiGetFileVersion()?

Weitere Informationen:Der gleiche Fehler tritt mit MSI 3.0 unter Windows XP und MSI 4.0 auf Vista.

War es hilfreich?

Lösung

Einfach der Vollständigkeit halber ::MsiGetFileVersion() ist eine Funktion, liest die version der Ressource, die Informationen aus einer PE-Datei (.exe oder .dll), die gleichen wie der Windows Installer nicht.Das ist wichtig für die build-tools (wie z.B. der WiX toolset) zu bedienen, so dass Sie bevölkern die Datei/@Version korrekt ist.Es wird nicht bekommen Sie die version, die Informationen aus einer MSI-Datei.Wie @sascha zeigt Sie könnten die Abfrage der Eigenschaft Tabelle für die "ProductVersion", oder Sie könnte verwenden Sie den ::MsiGetProductProperty (), die das gleiche tun.

Andere Tipps

Für Referenz, hier ist ein VBscript-Beispiel, das ich verwende in meinen build-Prozess zu packen, wie vor der Erstellung eines 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 

Eine Lösung gefunden:anstelle von aufrufen MsiGetFileVersion(), Aufruf:

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

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

MsiCloseHandle( hProduct );

(die Fehlerbehandlung weggelassen)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top