为什么VIProductVersion参数会覆盖ProductVersion键的值?

Boj*_*zec 5 nsis

来自nsi脚本的代码片段:

VIProductVersion 1.2.0.0   
VIAddVersionKey /LANG=${LANG_ENGLISH} FileVersion 1.1.0.0
Run Code Online (Sandbox Code Playgroud)

我想将FileVersion设置为,1.1.0.0但在文件属性中将其设置为1.2.0.0。我还注意到,单独VIProductVersion执行会添加FileVersion键并设置其值。

文档说VIProductVersion添加了产品版本,但我看到的是实际上已添加FileVersion。这是NSIS中的错误吗?VIAddVersionKey FileVersion如果将它设置的值替换为一个set by 的目的是VIProductVersion什么?

VIAddVersionKey需要VIProductVersion调用,否则脚本不会编译。

我正在使用的版本:EclipseNSIS 0.9.8;MakeNSIS 2.46。操作系统:Windows 7。

And*_*ers 4

版本信息资源存储分为两部分:

  • VS_FIXEDFILEINFO是包含产品和文件版本的固定块,VIProductVersion 设置此
  • 零个、一个或多个(多种语言)带有一个或多个 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
Run Code Online (Sandbox Code Playgroud)

这通常就足够了,但它不会让您设置 PRODUCTVERSION != FILEVERSION。

我认为这是 NSIS 中的一个错误,他们应该添加 VIFileVersion 命令或将 VIProductVersion 扩展为VIProductVersion <productver> [filever].

您可以在跟踪器上添加功能请求。

同时,您可以通过在构建期间使用 !packhdr调用资源黑客来解决此问题


编辑:

它可以在编译时使用 !packhdr、外部第 3 方工具(我无法让 reshacker 导入 .rc 版本资源,所以我必须先转换为 .res)和可怕的 hacks 在编译时使用 2.46 来完成:

!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"
Run Code Online (Sandbox Code Playgroud)

...您最终会得到这个版本资源:

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
}
}
Run Code Online (Sandbox Code Playgroud)