Pergunta

Eu criei um arquivo MSI com WIX. O arquivo wix de origem contém as informações da versão como esta:

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

O arquivo MSI parece funcionar bem: ele é instalado, desinstala, ele atualiza quando eu aumentar o número da versão, etc.

No entanto, quando tento obter as informações da versão sobre esse arquivo chamando a API MSIGETFILEVERSION (), ele retorna o erro 1006 (ERROR_FILE_INVALID O arquivo não contém informações de versão.)

Portanto, minha pergunta: como (programaticamente, em C ++) recuperar o número da versão de um arquivo MSI? Ou, para colocar de outra maneira, onde no arquivo WIX as informações da versão devem ir para ser recuperável via msigetfileversion ()?

Mais informações: o mesmo erro ocorre com o MSI 3.0 no Windows XP e MSI 4.0 no Vista.

Foi útil?

Solução

Apenas por completude, :: msigetfileversion () é uma função que lê as informações de recurso de versão de um arquivo PE (.exe ou .dll) o mesmo como o instalador do Windows faz. Isso é importante para ferramentas de construção (como o Wix Toolset) para usar, eles preenchem as informações do arquivo/@versão corretamente. Ele não obterá as informações da versão de um MSI. Como mostra o @sascha, você pode consultar a tabela de propriedades para o "ProductVersion" ou pode usar o :: msigetproductProperty () que fará o mesmo.

Outras dicas

Para referência, aqui está um exemplo do VBScript que estou usando no meu processo de construção para pegar isso antes de criar um boostraper.

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 

Encontrei uma solução: em vez de chamar o msigetfileversion (), ligue para:

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

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

MsiCloseHandle( hProduct );

(Manuseio de erros omitido)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top