MSIファイルのバージョンの取得(WiXでビルド)
-
03-07-2019 - |
質問
WiXでMSIファイルを作成しました。ソースWiXファイルには、次のようなバージョン情報が含まれています。
<Product Id="..."
Name="..."
Language="1033"
Version="1.0.0.1"
Manufacturer="..."
UpgradeCode="...">
MSIファイルは正常に機能しているようです。インストール、アンインストール、バージョン番号を増やすとアップグレードなど
ただし、MsiGetFileVersion()APIを呼び出してこのファイルに関するバージョン情報を取得しようとすると、エラー1006(ERROR_FILE_INVALID ファイルにはバージョン情報が含まれていません。)
それで私の質問:(プログラムで、C ++で)MSIファイルのバージョン番号を取得する方法は?または、別の言い方をすれば、MsiGetFileVersion()を介して取得できるようにするために、バージョン情報をWiXファイルのどこに置くべきでしょうか?
詳細:Windows XPのMSI 3.0およびVistaのMSI 4.0でも同じエラーが発生します。
解決
完全を期すため、:: MsiGetFileVersion()は、Windowsインストーラーと同じ方法でPEファイル(.exeまたは.dll)からバージョンリソース情報を読み取る関数です。これは、ビルドツール( WiXツールセットなど)がFile / @ Version情報を正しく入力するために使用するために重要です。 。 MSIからバージョン情報を取得することはありません。 @saschaが示すように、&quot; ProductVersion&quot;のPropertyテーブルを照会できます。または、同じことを行う:: MsiGetProductProperty()を使用できます。
他のヒント
参考までに、ブースターラッパーを作成する前にビルドプロセスでそのようなものを取得するために使用している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
解決策が見つかりました:MsiGetFileVersion()を呼び出す代わりに、呼び出します:
MSIHANDLE hProduct = NULL;
MsiOpenPackage( pszPath, &hProduct );
MsiGetProductProperty( hProduct, _T("ProductVersion"), pszVersion, &dwSizeVersion );
MsiCloseHandle( hProduct );
(エラー処理は省略)