2011-07-28 2 views
4

코드는 NSI 스크립트에서 니펫을 :왜 VIProductVersion 인수가 ProductVersion 키 값을 무시하나요?

VIProductVersion 1.2.0.0 
VIAddVersionKey /LANG=${LANG_ENGLISH} FileVersion 1.1.0.0 

내가 의 FileVersion1.1.0.0에 있지만, 파일 속성에서이 1.2.0.0로 설정 설정합니다. 나는 또한 VIProductVersion 자체가 FileVersion 키를 추가하고 그 값을 설정하는 것으로 나타났습니다.

문서는 VIProductVersion제품 버전을 추가하지만 내가 볼 것은 의 FileVersion가 실제로 추가되는 것을 말한다. NSIS의 버그입니까? VIAddVersionKey FileVersion의 값은 VIProductVersion으로 설정된 값보다 우선합니다.

VIAddVersionKeyVIProductVersion 전화를 요구합니다. 그렇지 않으면 스크립트가 컴파일되지 않습니다.

사용중인 버전 : EclipseNSIS 0.9.8; MakeNSIS 2.46. OS : 윈도우 버전 정보 자원이 두 부분에 저장되어있는 7

답변

4

:

  • VS_FIXEDFILEINFO 제품 및 파일 버전의 고정 블록은 VIProductVersion이
  • 0 개, 1 개 이상 (여러 언어를 설정합니다) 문자열 블록에 하나 이상의 name = value 문자열이 있으면 VIAddVersionKey가이를 설정합니다.

일부 응용 프로그램은의 FileVersion 문자열을 사용하여 문자열이없는 경우 VS_FIXEDFILEINFO :: dwFileVersion으로 폴백, 다른 응용 프로그램은 VS_FIXEDFILEINFO이 :: dwFileVersion 등

VIProductVersion "1.2.3.4"의 모습 버전 헤더를 생성합니다 사용

1 VERSIONINFO 
FILEVERSION 1,2,3,4 
PRODUCTVERSION 1,2,3,4 
FILEOS 0x4 
FILETYPE 0x1 

종종 충분하지만 PRODUCTVERSION = FILEVERSION을 설정할 수 없습니다.

나는 이것을 NSIS의 버그라고 생각한다. VIFileVersion 명령어를 추가하거나 VIProductVersion을 VIProductVersion <productver> [filever]으로 확장해야한다.

tracker에 기능 요청을 추가 할 수 있습니다. !의 당신이 packhdr와 빌드하는 동안 resource hacker를 호출하여이 문제를 해결 할 수있을 그 동안


편집 :

이와 컴파일시에 2.46 수행 할 수 있습니다

! packhdr, 외부 타사 도구 (reshacker가 .rc 버전 리소스를 가져올 수 없어 .res 먼저 변환해야 함) 및 끔찍한 해킹 :

!macro HackyVIFileVersion reshack gorcjorg fixedfilever 
;http://www.angusj.com/resourcehacker/ 
;http://web.archive.org/web/20090918063311/http://www.jorgon.freeserve.co.uk/Gorcjorg.zip 
!searchreplace HackyVIFileVersion_id "${__TIME__}" ":" "" 
!define HackyVIFileVersion_cmd "$%TEMP%\nsisVIFV${HackyVIFileVersion_id}.cmd" 
!appendfile "${HackyVIFileVersion_cmd}" `@echo off&setlocal ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION$\n` 
!appendfile "${HackyVIFileVersion_cmd}" `set eh=%TEMP%\exehead%~1.tmp$\n` 
!appendfile "${HackyVIFileVersion_cmd}" `set rh=%~2$\n` 
!appendfile "${HackyVIFileVersion_cmd}" `call "%rh%" -extract "%eh%", "%eh%1.rc", VersionInfo,1,$\n` 
!appendfile "${HackyVIFileVersion_cmd}" `> "%eh%2.rc" echo.LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US $\n` ;must force lang for Gorcjorg 
!appendfile "${HackyVIFileVersion_cmd}" `FOR /F "usebackq tokens=* delims=" %%A IN ("%eh%1.rc") DO ($\n` 
!appendfile "${HackyVIFileVersion_cmd}" ` FOR /F "usebackq" %%B IN ('%%A') DO ($\n` 
!appendfile "${HackyVIFileVersion_cmd}" `  if "%%~B"=="FILEVERSION" (>> "%eh%2.rc" echo.FILEVERSION %~4) else (>> "%eh%2.rc" echo.%%A)$\n` 
!appendfile "${HackyVIFileVersion_cmd}" ` )$\n` 
!appendfile "${HackyVIFileVersion_cmd}" `)$\n` 
!appendfile "${HackyVIFileVersion_cmd}" `call "%~3" /fo "%eh%.res" /r "%eh%2.rc"$\n` 
!appendfile "${HackyVIFileVersion_cmd}" `call "%rh%" -addoverwrite "%eh%", "%eh%", "%eh%.res", versioninfo,1,$\n` 
!appendfile "${HackyVIFileVersion_cmd}" `del "%eh%2.rc"&del "%eh%1.rc"&del "%eh%.res"&del "%~0"` 
!packhdr "$%TEMP%\exehead${HackyVIFileVersion_id}.tmp" '"${HackyVIFileVersion_cmd}" "${HackyVIFileVersion_id}" "${reshack}" "${gorcjorg}" "${fixedfilever}"' 
!undef HackyVIFileVersion_cmd 
!undef HackyVIFileVersion_id 
!macroend 


VIProductVersion "1.2.3.4" 
VIAddVersionKey /LANG=1033 FileVersion 5.6.7.8 
VIAddVersionKey /LANG=1033 ProductVersion "1.2.3.4" 
VIAddVersionKey /LANG=1033 Comments "A test comment" 
!insertmacro HackyVIFileVersion "C:\tools\ResHacker.exe" "C:\tools\GoRC.exe" "5,6,7,8" 

...이 버전 리소스로 끝납니다 :

1 VERSIONINFO 
FILEVERSION 5,6,7,8 
PRODUCTVERSION 1,2,3,4 
FILEOS 0x4 
FILETYPE 0x1 
{ 
BLOCK "StringFileInfo" 
{ 
    BLOCK "040904e4" 
    { 
     VALUE "Comments", "A test comment" 
     VALUE "FileVersion", "5.6.7.8" 
     VALUE "ProductVersion", "1.2.3.4" 
    } 
} 

BLOCK "VarFileInfo" 
{ 
    VALUE "Translation", 0x0409 0x04E4 
} 
} 
+0

감사합니다. VIProductVersion이 어떻게 작동하는지 이해하는 데 도움이되었습니다. 그것은 정말로 당신이 제안한대로 확장되어야합니다, 또는 적어도, 발언은 그것에 대해 NSIS 문서에 추가되어야합니다. –

+0

VIFileVersion이 SVN에 추가되었습니다 ... – Anders

1

나는이 버그에 대한 확실한 해결 방법을 언급 할 것이라고 생각했습니다. VIProductVersionPRODUCTVERSION을 설정하여 다음 의 FileVersion와 VIAddVersionKey로 설정 NSIS 2.46 사용하는 경우

, 당신은 또한 NSIS 컴파일러 경고를 피하기 위해 의 FileVersion을 설정해야합니다.

VIProductVersion ${INSTALLER_VERSION} 
VIAddVersionKey ProductName ${PROGRAM_NAME} 
VIAddVersionKey FileVersion ${INSTALLER_VERSION} 
VIAddVersionKey ProductVersion ${PROGRAM_VERSION} 
... 
관련 문제