版本信息資源存儲在兩個部分:
- VS_FIXEDFILEINFO是產品和文件版本的固定塊,VIProductVersion設置此
- 零,一個或多個(多國語言)帶有一個或多個name = value字符串的字符串塊,VIAddVersionKey設置這些字符串塊。
有些應用程序使用的文件版本字符串,並回落到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
}
}
謝謝你的回答,它真的幫助我瞭解'VIProductVersion'的工作原理。它的確應該按照你的建議進行擴展,或者至少應該在NSIS文檔中增加一條評論。 –
VIFileVersion現已添加到SVN ... – Anders