2009-05-02 3 views
8

WiX로 MSI 파일을 만들었습니다. 그러나, 그것은 내가 버전 번호를 증가시킬 때 업그레이드, 제거, 설치 등(WiX로 제작 된) MSI 파일의 버전 검색

:

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

MSI 파일

확인을 작동하는 것 : 소스 윅스 파일은 다음과 같이 버전 정보를 포함 나는 그것이 오류 1006 반환의 MsiGetFileVersion() API를 호출하여이 파일에 대한 버전 정보를 얻을하려고

따라서 내 질문 (버전 정보를 포함하지 않는 ERROR_FILE_INVALID 파일.) : 어떻게 (프로그래밍, C++에서) 검색 MSI 파일의 버전 번호? 또는 다른 방법으로 말하면, WiX 파일에서 MsiGetFileVersion()을 통해 버전 정보를 검색 할 수 있어야합니까?

추가 정보 : Windows XP의 MSI 3.0과 Vista의 MSI 4.0에서 같은 오류가 발생합니다.

답변

6

그냥 완전성을 위해, :: MsiGetFileVersion()는 PE 파일 (.EXE 또는 .dll) Windows Installer가 수행하는 같은 방법에서 버전 리소스 정보를 읽는 기능입니다. 이는 File/@ Version 정보를 올바르게 채울 수 있도록 사용할 빌드 도구 (예 : WiX toolset)에 중요합니다. MSI에서 버전 정보를 얻을 수 없습니다. @ sascha는 "ProductVersion"에 대한 Property 테이블을 쿼리하거나 동일한 작업을 수행하는 :: MsiGetProductProperty()를 사용할 수 있음을 보여줍니다.

+2

MsiGetFileVersion()에 대한 MSDN 문서가 필요하다고 말하면 2 시간 동안 작동하도록 노력하겠습니다. –

4

해결책을 찾았 대신 MsiGetFileVersion()를 호출하는 전화 :

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

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

MsiCloseHandle(hProduct); 

참고로
7

가, 여기에 내가 내 빌드 프로세스에 사용 해요 VBScript를 예입니다 (오류가 생략 핸들링) 부스트 래퍼 (boostrapper)를 만들기 이전에 잡아라.

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 
+0

Saschabeaunont - 이중 WScript.Echo getproperty ("ProductVersion")'의 이유는 무엇입니까? – user66001

+0

또한 - 더 많은 MSI 정보가 필요한 사람들을 위해이 작은 보석을 한번보세요 - http://stackoverflow.com/questions/5063129/how-to-find-the-upgrade-code-productcode-of-an-installed -application-in-win-7/17871498 # 17871498 – user66001