8

WiXでMSIファイルを作成しました。ソースWiXファイルには、次のようなバージョン情報が含まれています。

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

MSIファイルは正常に機能しているようです。バージョン番号を増やすと、インストール、アンインストール、アップグレードなどが行われます。

ただし、MsiGetFileVersion()APIを呼び出してこのファイルのバージョン情報を取得しようとすると、エラー1006が返されます(ERROR_FILE_INVALIDファイルにバージョン情報が含まれていません)。

したがって、私の質問:MSIファイルのバージョン番号を(プログラムで、C ++で)取得する方法は?または、別の言い方をすれば、MsiGetFileVersion()を介して取得できるようにするには、WiXファイルのどこにバージョン情報を配置する必要がありますか?

詳細:WindowsXPのMSI3.0とVistaのMSI4.0でも同じエラーが発生します。

4

3 に答える 3

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 
于 2009-05-03T02:03:08.473 に答える
6

完全を期すために、:: MsiGetFileVersion()は、Windowsインストーラーと同じ方法でPEファイル(.exeまたは.dll)からバージョンリソース情報を読み取る関数です。これは、ビルドツール(WiXツールセットなど)がFile /@Version情報を正しく入力するために使用するために重要です。MSIからバージョン情報を取得することはありません。@saschaが示すように、プロパティテーブルで「ProductVersion」をクエリするか、同じことを行う:: MsiGetProductProperty()を使用できます。

于 2009-05-03T17:19:40.597 に答える
4

解決策を見つけました:MsiGetFileVersion()を呼び出す代わりに、次を呼び出します。

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

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

MsiCloseHandle( hProduct );

(エラー処理は省略)

于 2009-05-03T00:29:18.433 に答える