2009-05-02 2 views
8

Я создал файл MSI с WiX. Исходный файл WiX содержит информацию о версии, как это:Извлечение версии файла MSI (построенного с помощью WiX)

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

MSI-файл, кажется, работает нормально: он устанавливает, что удаления, он обновляет, когда я увеличить номер версии и т.д.

Однако, когда Я пытаюсь получить информацию о версии об этом файле, вызвав MsiGetFileVersion() API, он возвращает ошибку 1006

Отсюда мой вопрос (ERROR_FILE_INVALID файл не содержит информацию о версии.): как (программно, в C++) получить номер версии файла MSI? Или, другими словами, где в файле WiX должна отображаться информация о версии, чтобы ее можно было восстановить через MsiGetFileVersion()?

Дополнительная информация: Такая же ошибка возникает с MSI 3.0 в Windows XP и MSI 4.0 на Vista.

ответ

6

Просто для полноты картины :: MsiGetFileVersion() является функцией, которая считывает информацию о версии ресурса из PE-файла (.exe или .dll) в же образом установщик Windows делает. Это важно для использования инструментов построения (например, WiX toolset), чтобы они правильно заполняли информацию о файле/версии. Он не получит информацию о версии из MSI. Как показано в @sascha, вы можете запросить таблицу Property для «ProductVersion», или вы можете использовать :: MsiGetProductProperty(), который будет делать то же самое.

+2

Я хочу, чтобы документы MSDN для MsiGetFileVersion() сказали, что я бы не потратил два часа, пытаясь заставить его работать ... –

4

Найдено решение: вместо вызова MsiGetFileVersion(), звоните:

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

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

MsiCloseHandle(hProduct); 

(обработка ошибок опущена)

7

Для справки, вот пример VBscript, что я использую в моем процессе сборки для хватайте их до создания ускорителя.

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 - Любая причина для двойной 'WScript.Echo getproperty (« ProductVersion »)' 's? – user66001

+0

Также - для тех, кому нужна дополнительная информация о MSI, взгляните на этот маленький драгоценный камень - http://stackoverflow.com/questions/5063129/how-to-find-the-upgrade-code-productcode-of-an-installed -application-in-win-7/17871498 # 17871498 – user66001

Смежные вопросы