【问题标题】:Why does VIProductVersion argument override value of ProductVersion key?为什么 VIProductVersion 参数会覆盖 ProductVersion 键的值?
【发布时间】:2011-07-28 12:43:19
【问题描述】:

来自 nsi 脚本的代码 sn-p:

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

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

文档说VIProductVersion 添加了 Product Version 但我看到的是实际上添加了 FileVersion。这是NSIS中的错误吗?如果VIAddVersionKey FileVersion 设置的值被VIProductVersion 设置的值覆盖,那么VIAddVersionKey FileVersion 的用途是什么?

VIAddVersionKey 需要VIProductVersion 调用,否则脚本无法编译。

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

【问题讨论】:

    标签: nsis


    【解决方案1】:

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

    • 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
    

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

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

    您可以在tracker 上添加功能请求。

    与此同时,您可以通过在构建期间使用 !packhdr 调用 resource hacker 来解决此问题


    编辑:

    它可以在编译时使用 2.46 完成,使用 !packhdr、外部 3rd 方工具(我无法让 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 文档中添加关于它的注释。
    【解决方案2】:

    我想我会提到这个错误的明显解决方法。

    使用 NSIS 2.46 时,将 VIProductVersion 设置为您的 FileVersion,然后使用 VIAddVersionKey 设置 ProductVersion,您将还需要设置 Fileversion 以避免 NSIS 编译器警告。

    VIProductVersion ${INSTALLER_VERSION}
    VIAddVersionKey ProductName ${PROGRAM_NAME}
    VIAddVersionKey FileVersion ${INSTALLER_VERSION}
    VIAddVersionKey ProductVersion ${PROGRAM_VERSION}
    ...
    

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2012-05-29
      • 2015-12-27
      • 1970-01-01
      相关资源
      最近更新 更多