Abrufen der version der MSI-Datei (gebaut mit WiX)
-
03-07-2019 - |
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.
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)