문제

을 만들었 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 );

(오류 처리 생략)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top