검색 버전의 MSI 파일을(기본 제공을 가진 WiX)
-
03-07-2019 - |
문제
을 만들었 MSI 파일을 가진 WiX.소 WiX 파일에 포함되어 버전 정보를 다음과 같다:
<Product Id="..."
Name="..."
Language="1033"
Version="1.0.0.1"
Manufacturer="..."
UpgradeCode="...">
MSI 파일을 작동하는 것인:그것이 설치 제거,업그레이드할 때 나는 증가는 버전 번호 등입니다.
그러나 때,나도 버전에 대한 정보를 이 파일에 의해 호출 MsiGetFileVersion()API,그것은 오류를 반환합 1006(ERROR_FILE_INVALID 파일 버전 정보가 포함되지 않았습니다.)
그러므로 나의 질문:하는 방법(에서 프로그래밍 방식으로 C++)검색 버전 번호의 MSI 파일입니까?거나,다른 방법을 넣어,어디에서 소개하고,파일 버전 정보로 이동하기 위해서 검색을 통해 MsiGetFileVersion()?
더 많은 정보:같은 오류가 발생 MSI3.0Windows XP 에서 MSI4.0 에 Vista.
해결책
그냥에 대한 완벽을 기하기 위해::MsiGetFileVersion()함수는 버전을 읽고 리소스 정보를 PE 파일(.exe 또는.dll)가 동 방법 Windows Installer 않습니다.중요한 빌드 도구(예: WiX 도구 용)그래서 그들은 채 파일/@버전 정보를 올바르게.그것을 얻지 않을 것입니다 당신의 버전 정보를 MSI.로@샤여 쿼리할 수 있습니다 호텔 테이블에 대한"ProductVersion"또는 사용할 수 있습니다::MsiGetProductProperty()는 동일한 작업을 수행합니다.
다른 팁
참고로, Boostrapper를 만들기 전에 빌드 프로세스에서 사용하는 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 );
(오류 처리 생략)