如何设置现有.exe,.dll的版本信息?

Car*_*arl 101 windows versioning dll exe fileversioninfo

作为构建过程的一部分,我需要为所有已编译的二进制文件设置版本信息.一些二进制文件已经有版本信息(在编译时添加),有些则没有.

我希望能够应用以下信息:

  • 公司名
  • 版权声明
  • 产品名称
  • 产品描述
  • 文件版本
  • 产品版本

所有这些属性都由构建脚本指定,并且必须在编译后应用.这些是使用C++ Builder 2007编译的标准二进制文件(而不是程序集).

我怎样才能做到这一点?

Uwe*_*ayr 55

虽然它不是批处理过程,但Visual Studio也可以添加/编辑文件资源.

只需在.EXE或.DLL上使用File-> Open-> File.这对于在构建后修复版本信息或将其添加到没有这些资源的文件开始时非常方便.

  • 当我尝试它时,这非常有效.对于完全缺少版本信息的文件:在Visual Studio中打开DLL后,转到"编辑">"添加资源">"版本",然后单击"新建".然后在新版本选项卡中,更改FILEVERSION和PRODUCTVERSION,CompanyName等.保存文件,您就完成了! (8认同)
  • 在Windows 8,VS 2015上试过这个(添加版本信息)并且在Windows资源管理器中一切都很好,除了......可执行文件将不再启动. (3认同)
  • @UweBaemayr。您引用的答案与我可以进行自动化的方式一样,我们是否可以使其自动化,就像我做相同的帖子构建一样。但是如何? (2认同)
  • 对于我的旧 Delphi win32 dll,这不起作用。尽管 dll 信息已正确更改,但在对其运行健全性检查时,您会发现它已损坏。 (2认同)

Dan*_*ett 31

与许多其他答案不同,此解决方案使用完全免费的软件.

首先,创建一个这样的文件Resources.rc:

VS_VERSION_INFO VERSIONINFO
    FILEVERSION    1,0,0,0
    PRODUCTVERSION 1,0,0,0
{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904b0"
        {
            VALUE "CompanyName",        "ACME Inc.\0"
            VALUE "FileDescription",    "MyProg\0"
            VALUE "FileVersion",        "1.0.0.0\0"
            VALUE "LegalCopyright",     "© 2013 ACME Inc. All Rights Reserved\0"
            VALUE "OriginalFilename",   "MyProg.exe\0"
            VALUE "ProductName",        "My Program\0"
            VALUE "ProductVersion",     "1.0.0.0\0"
        }
    }
    BLOCK "VarFileInfo"
    {
        VALUE "Translation", 0x409, 1200
    }
}
Run Code Online (Sandbox Code Playgroud)

接下来,使用GoRC将其编译为.res文件:

GoRC /fo Resources.res Resources.rc
Run Code Online (Sandbox Code Playgroud)

(见下面我的评论镜子GoRC.exe)

然后在CLI模式下使用Resource Hacker将其添加到现有模式.exe:

ResHacker -add MyProg.exe, MyProg.exe, Resources.res,,,
Run Code Online (Sandbox Code Playgroud)

而已!

  • 好像命令行已经改变了一点:`ResourceHacker.exe -open Source.dll -save Changed.dll -action addoverwrite -resource Version.res`另外,ResourceHacker可以自己编译.rc文件:`ResourceHacker.exe -open Version. rc -save Version.res -action compile` (4认同)
  • 您也可以使用Microsoft [资源编译器](http://msdn.microsoft.com/en-us/library/windows/desktop/aa381042(v = vs.85).aspx)代替GoRC.它可以在Windows SDK中使用. (3认同)
  • @CharlesB 我自己注意到了这一点,但这是正确的链接。看起来有人忘记向他们的网络托管服务商付款!这是二进制文件,我已将其镜像到我的公共 Assembla 帐户:https://www.assembla.com/code/danny-beckett/subversion/nodes/13/GoRC.exe (2认同)

小智 22

或者你可以查看Win32 exe/dll文件的免费软件StampVer.
如果文件和产品版本已经有版本资源,它只会更改文件和产品版本.如果不存在版本资源,则无法添加版本资源.


a p*_*erd 18

rcedit相对较新,并且可以从命令行运行良好:https://github.com/atom/rcedit

$ rcedit "path-to-exe-or-dll" --set-version-string "Comments" "This is an exe"
$ rcedit "path-to-exe-or-dll" --set-file-version "10.7"
$ rcedit "path-to-exe-or-dll" --set-product-version "10.7"
Run Code Online (Sandbox Code Playgroud)

还有一个NPM模块,它包含JavaScript和Grunt任务,以防你使用Grunt.

  • 请注意,rcedit只能修改现有资源而不能插入新资源 (5认同)
  • 这个工具非常讨厌,请在将其应用到您的二进制文件之前查看此错误:https://github.com/electron/rcedit/issues/51 (3认同)
  • 不适用于7zip sfx存档:/仅切出7zip存档部分。 (2认同)

fil*_*fel 14

这样的事情怎么样?

verpatch /va foodll.dll %VERSION% %FILEDESCR% %COMPINFO% %PRODINFO% %BUILDINFO%
Run Code Online (Sandbox Code Playgroud)

这里完全开放代码.


Cri*_*ati 12

有多种工具,许多很棒的答案都提到了,我将选择一个。

资源黑客

我从[AngusJ]: Resource Hacker下载了最新版本 ( 5.1.7 ) 。所有需要的信息都可以在该页面上找到(命令行选项、脚本等)。在下面的演练中,我将操作 2 个可执行文件(实验室老鼠),它们(出于显而易见的原因)我已复制到cwd 中

  • ResourceHacker.exe:我认为对自己进行操作会很有趣
  • cmake.exe:没有版本信息集的随机可执行文件(我机器上v3.6.3安装的一部分)

在进一步讨论之前,我想提一下ResourceHacker有一个有趣的终端输出,下面的复制/粘贴片段可能会产生一些混乱。

1. 设置

这更像是一个初步步骤,熟悉环境,表明没有时髦的业务正在进行,......

e:\Work\Dev\StackOverflow\q000284258> sopr.bat
*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***

[prompt]> dir
 Volume in drive E is Work
 Volume Serial Number is 3655-6FED

 Directory of e:\Work\Dev\StackOverflow\q000284258

2019-01-28  20:09    <DIR>          .
2019-01-28  20:09    <DIR>          ..
2016-11-03  09:17         5,413,376 cmake.exe
2019-01-03  02:06         5,479,424 ResourceHacker.exe
2019-01-28  20:30               496 ResourceHacker.ini
               3 File(s)     10,893,296 bytes
               2 Dir(s)  103,723,261,952 bytes free

[prompt]> set PATH=%PATH%;c:\Install\x64\CMake\CMake\3.6.3\bin

[prompt]> .\cmake --help >nul 2>&1

[prompt]> echo %errorlevel%
0

[prompt]> .\ResourceHacker.exe -help

[prompt]>

==================================
Resource Hacker Command Line Help:
==================================

-help             : displays these abbreviated help instructions.
-help commandline : displays help for single commandline instructions
-help script      : displays help for script file instructions.




[prompt]> echo %errorlevel%
0
Run Code Online (Sandbox Code Playgroud)

正如所见,可执行文件没问题,它们运行良好,下面是它们的详细信息(我们关心的)的样子:

img0-初始

2. 资源

资源文件是包含资源的文本文件。资源(简化)具有:

  • 姓名
  • 类型
  • 价值

有关更多详细信息,请查看[MS.Docs]:关于资源文件。有许多工具(在现有答案中提到)可以促进资源文件的编辑,例如:

  • VStudio在开始一个新项目时会创建一个默认的
  • 可以手动创建这样的文件
  • 但是,因为它是关于Resource Hacker 的,并且:

    • 它能够从现有的可执行文件中提取资源
    • 它嵌入了资源(如上图所示)

    我将在这一步中使用它 ( -action extract)

接下来,为了将资源嵌入到.exe ( .dll , ...) 中,必须将其编译为适合PE格式的二进制形式。同样,有很多工具可以实现这一点,但正如您可能猜到的那样,我将坚持使用Resource Hacker ( -action compile)。

[prompt]> :: Extract the resources into a file
[prompt]> .\ResourceHacker.exe -open .\ResourceHacker.exe -save .\sample.rc -action extract -mask VersionInfo,, -log con

[prompt]>

[28 Jan 2019, 20:58:03]

Current Directory:
e:\Work\Dev\StackOverflow\q000284258

Commandline:
.\ResourceHacker.exe  -open .\ResourceHacker.exe -save .\sample.rc -action extract -mask VersionInfo,, -log con

Open    : e:\Work\Dev\StackOverflow\q000284258\ResourceHacker.exe
Save    : e:\Work\Dev\StackOverflow\q000284258\sample.rc


Success!

[prompt]> :: Modify the resource file and set our own values
[prompt]>
[prompt]> :: Compile the resource file
[prompt]> .\ResourceHacker.exe -open .\sample.rc -save .\sample.res -action compile -log con

[prompt]>

[28 Jan 2019, 20:59:51]

Current Directory:
e:\Work\Dev\StackOverflow\q000284258

Commandline:
.\ResourceHacker.exe  -open .\sample.rc -save .\sample.res -action compile -log con

Open    : e:\Work\Dev\StackOverflow\q000284258\sample.rc
Save    : e:\Work\Dev\StackOverflow\q000284258\sample.res

Compiling: e:\Work\Dev\StackOverflow\q000284258\sample.rc
Success!

[prompt]> dir /b
cmake.exe
ResourceHacker.exe
ResourceHacker.ini
sample.rc
sample.res
Run Code Online (Sandbox Code Playgroud)

在您的情况下,不需要保存和编辑资源文件,因为该文件已经存在,我只是为了演示目的而这样做。下面是修改后(因此在编译之前)的资源文件。

样本.rc

1 VERSIONINFO
FILEVERSION 3,1,4,1592
PRODUCTVERSION 2,7,1,8
FILEOS 0x4
FILETYPE 0x1
{
BLOCK "StringFileInfo"
{
    BLOCK "040904E4"
    {
        VALUE "CompanyName", "Cristi Fati\0"
        VALUE "FileDescription", "20190128 - SO q000284258 demo\0"
        VALUE "FileVersion", "3.1.4.1592\0"
        VALUE "ProductName", "Colonel Panic\0"
        VALUE "InternalName", "100\0"
        VALUE "LegalCopyright", "(c) Cristi Fati 1999-2999\0"
        VALUE "OriginalFilename", "ResHack\0"
        VALUE "ProductVersion", "2.7.1.8\0"
    }
}

BLOCK "VarFileInfo"
{
    VALUE "Translation", 0x0409 0x04E4  
}
}
Run Code Online (Sandbox Code Playgroud)

3. 嵌入

这也将由资源黑客( -action addoverwrite) 执行。由于.exe已被复制,因此我将就地编辑它们的资源。

[prompt]> .\ResourceHacker.exe -open .\cmake.exe -save .\cmake.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

[prompt]>

[28 Jan 2019, 21:17:19]

Current Directory:
e:\Work\Dev\StackOverflow\q000284258

Commandline:
.\ResourceHacker.exe  -open .\cmake.exe -save .\cmake.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

Open    : e:\Work\Dev\StackOverflow\q000284258\cmake.exe
Save    : e:\Work\Dev\StackOverflow\q000284258\cmake.exe
Resource: e:\Work\Dev\StackOverflow\q000284258\sample.res

  Added: VERSIONINFO,1,1033

Success!

[prompt]> copy ResourceHacker.exe ResourceHackerTemp.exe
        1 file(s) copied.

[prompt]> .\ResourceHackerTemp.exe -open .\ResourceHacker.exe -save .\ResourceHacker.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

[prompt]>

[28 Jan 2019, 21:19:29]

Current Directory:
e:\Work\Dev\StackOverflow\q000284258

Commandline:
.\ResourceHackerTemp.exe  -open .\ResourceHacker.exe -save .\ResourceHacker.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

Open    : e:\Work\Dev\StackOverflow\q000284258\ResourceHacker.exe
Save    : e:\Work\Dev\StackOverflow\q000284258\ResourceHacker.exe
Resource: e:\Work\Dev\StackOverflow\q000284258\sample.res

  Modified: VERSIONINFO,1,1033

Success!

[prompt]> del /f /q ResourceHackerTemp.*

[prompt]> dir
 Volume in drive E is Work
 Volume Serial Number is 3655-6FED

 Directory of e:\Work\Dev\StackOverflow\q000284258

2019-01-28  21:20    <DIR>          .
2019-01-28  21:20    <DIR>          ..
2016-11-03  09:17         5,414,400 cmake.exe
2019-01-03  02:06         5,479,424 ResourceHacker.exe
2019-01-28  21:17               551 ResourceHacker.ini
2019-01-28  20:05             1,156 sample.rc
2019-01-28  20:59               792 sample.res
               5 File(s)     10,896,323 bytes
               2 Dir(s)  103,723,253,760 bytes free
Run Code Online (Sandbox Code Playgroud)

正如所见,我不得不做一些小技巧(Gainarie),因为我不能(至少我认为我不能)在使用时修改.exe

4. 测试

这是一个可选阶段,以确保:

  • 可执行文件仍然有效(它们在过程中没有搞砸)
  • 资源已添加/更新
[prompt]> .\cmake --help >nul 2>&1

[prompt]> echo %errorlevel%
0

[prompt]> .\ResourceHacker.exe -help

[prompt]>

==================================
Resource Hacker Command Line Help:
==================================

-help             : displays these abbreviated help instructions.
-help commandline : displays help for single commandline instructions
-help script      : displays help for script file instructions.




[prompt]> echo %errorlevel%
0
Run Code Online (Sandbox Code Playgroud)

以及他们的详细信息

Img1-最终


Oth*_*ide 10

有这个工具ChangeVersion [1]

功能列表(来自网站):

  • 命令行界面
  • 支持.EXE,.DLL和.RES文件
  • 根据版本掩码更新FileVersion和ProductVersion
  • 添加/更改/删除版本密钥字符串
  • 调整文件标志(调试,特殊,私有等)
  • 更新项目文件(.bdsproj | .bpr | .bpk | .dproj)
  • 添加/更改主应用程序图标
  • 使用带配置的ini文件
  • Windows Vista支持(需要提升)
  • 易于集成到持续构建环境中

完全披露:我知道写这个工具的人,我曾经和他一起工作过.但这也意味着我知道他制作了高质量的软件;)


[1]链接已经死了.download.cnet.com上似乎有镜像版本.

  • 第二个链接导致过期工具"更改版本v2012.9.6.0 - (C)2007-2012 The-Software-Box.com此试用版已过期" (4认同)
  • 在命令行中运行时,显示“更改版本 v2012.9.6.0 - (C)2007-2012 The-Software-Box.com This trial version has expired” (2认同)

小智 8

verpatch很好,但不处理unicode字符...
尝试ResourceLib


小智 6

我没有额外的工具.我刚刚将以下文件添加到我的Win32应用程序项目中.

一个头文件定义了一些常量,而不是我们可以在资源文件甚至程序代码上重用的常量.我们只需要维护一个文件.感谢Qt团队向我展示了如何在Qt项目上实现它,它现在也适用于我的Win32应用程序.

---- [version.h中] ----

#ifndef VERSION_H
#define VERSION_H

#define VER_FILEVERSION             0,3,0,0
#define VER_FILEVERSION_STR         "0.3.0.0\0"

#define VER_PRODUCTVERSION          0,3,0,0
#define VER_PRODUCTVERSION_STR      "0.3.0.0\0"

#define VER_COMPANYNAME_STR         "IPanera"
#define VER_FILEDESCRIPTION_STR     "Localiza archivos duplicados"
#define VER_INTERNALNAME_STR        "MyProject"
#define VER_LEGALCOPYRIGHT_STR      "Copyright 2016 ipanera@gmail.com"
#define VER_LEGALTRADEMARKS1_STR    "All Rights Reserved"
#define VER_LEGALTRADEMARKS2_STR    VER_LEGALTRADEMARKS1_STR
#define VER_ORIGINALFILENAME_STR    "MyProject.exe"
#define VER_PRODUCTNAME_STR         "My project"

#define VER_COMPANYDOMAIN_STR       "www.myurl.com"

#endif // VERSION_H
Run Code Online (Sandbox Code Playgroud)

---- [MyProjectVersion.rc] ----

#include <windows.h>
#include "version.h"

VS_VERSION_INFO VERSIONINFO
FILEVERSION     VER_FILEVERSION
PRODUCTVERSION  VER_PRODUCTVERSION
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904E4"
        BEGIN
            VALUE "CompanyName",        VER_COMPANYNAME_STR
            VALUE "FileDescription",    VER_FILEDESCRIPTION_STR
            VALUE "FileVersion",        VER_FILEVERSION_STR
            VALUE "InternalName",       VER_INTERNALNAME_STR
            VALUE "LegalCopyright",     VER_LEGALCOPYRIGHT_STR
            VALUE "LegalTrademarks1",   VER_LEGALTRADEMARKS1_STR
            VALUE "LegalTrademarks2",   VER_LEGALTRADEMARKS2_STR
            VALUE "OriginalFilename",   VER_ORIGINALFILENAME_STR
            VALUE "ProductName",        VER_PRODUCTNAME_STR
            VALUE "ProductVersion",     VER_PRODUCTVERSION_STR
        END
    END

    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1252
    END
END
Run Code Online (Sandbox Code Playgroud)

  • 只是好奇; 每次更改对话框或修改项目中的任何资源时,您如何阻止窗口覆盖您的 .rc 文件?到目前为止,我已经看过几篇这样的文章,如果您不必再次更改会导致 IDE 自动生成的资源,它似乎会起作用。 (2认同)

RDR*_*RDR 5

@DannyBeckett的上述回答对我帮助很大,

我将以下内容放在一个批处理文件中,并将其放在 ResourceHacker.exe 和我处理的 EXE 所在的同一文件夹中,并且效果很好。[您可以编辑它以满足您的需要]

    @echo off
    :start1
    set /p newVersion=Enter version number [?.?.?.?]:
    if "%newVersion%" == "" goto start1
    :start2
    set /p file=Enter EXE name [for 'program.exe' enter 'program']:
    if "%file%" == "" goto start2
    for /f "tokens=1-4 delims=." %%a in ('echo %newVersion%') do (set ResVersion=%%a,%%b,%%c,%%d)
    (
    echo:VS_VERSION_INFO VERSIONINFO
    echo:    FILEVERSION    %ResVersion%
    echo:    PRODUCTVERSION %ResVersion%
    echo:{
    echo:    BLOCK "StringFileInfo"
    echo:    {
    echo:        BLOCK "040904b0"
    echo:        {
    echo:            VALUE "CompanyName",        "MyCompany\0"
    echo:            VALUE "FileDescription",    "TestFile\0"
    echo:            VALUE "FileVersion",        "%newVersion%\0"
    echo:            VALUE "LegalCopyright",     "COPYRIGHT © 2019 MyCompany\0"
    echo:            VALUE "OriginalFilename",   "%file%.exe\0"
    echo:            VALUE "ProductName",        "Test\0"
    echo:            VALUE "ProductVersion",     "%newVersion%\0"
    echo:        }
    echo:    }
    echo:    BLOCK "VarFileInfo"
    echo:    {
    echo:        VALUE "Translation", 0x409, 1200
    echo:    }
    echo:}
    ) >Resources.rc     &&      echo setting Resources.rc
    ResourceHacker.exe -open resources.rc -save resources.res -action compile -log CONSOLE
    ResourceHacker -open "%file%.exe" -save "%file%Res.exe" -action addoverwrite -resource "resources.res"  -log CONSOLE
    ResourceHacker.exe -open "%file%Res.exe" -save "%file%Ico.exe" -action addskip -res "%file%.ico" -mask ICONGROUP,MAINICON, -log CONSOLE
    xCopy /y /f "%file%Ico.exe" "%file%.exe"
    echo.
    echo.
    echo your compiled file %file%.exe is ready
    pause
Run Code Online (Sandbox Code Playgroud)

[作为旁注,我也使用了资源黑客来编译 res 文件,而不是 GoRC]


Car*_*ard 5

我想制作一个更紧凑的版本

\n
    \n
  • 第1步:创建资源
  • \n
  • 第2步:下载ResourceHacker
  • \n
  • 第三步:将res编译成rc文件
  • \n
  • 第四步:运行脚本:修改exe
  • \n
\n

第1步:创建resource

\n

准备资源文件:resource.rc

\n
VS_VERSION_INFO VERSIONINFO\n    FILEVERSION    0,0,0,0\n    PRODUCTVERSION 0,0,0,0\n{\n    BLOCK "StringFileInfo"\n    {\n        BLOCK "040904b0"\n        {\n            VALUE "CompanyName",        "\\0"\n            VALUE "FileDescription",    "\\0"\n            VALUE "FileVersion",        "0.0.0.0\\0"\n            VALUE "LegalCopyright",     "\xc2\xa9 2020 Carson. All rights reserved.\\0"\n            VALUE "OriginalFilename",   ".exe\\0"\n            VALUE "ProductName",        "\\0"\n            VALUE "ProductVersion",     "0.0.0.0\\0"\n        }\n    }\n    BLOCK "VarFileInfo"\n    {\n        VALUE "Translation", 0x0409, 1200\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

第2步:下载ResourceHacker

\n

有两种方法可以获得它。

\n
    \n
  1. 从Chocolatey下载:\n
      \n
    • 安装巧克力
    • \n
    • choco install reshack -y
    • \n
    • 安装后,您可能需要添加环境变量。
    • \n
    \n
  2. \n
  3. 资源黑客网站
  4. \n
\n

第三步:编译resrc文件

\n
ResourceHacker.exe -open resources.rc -save resources.res ^\n -action compile -log CONSOLE\n
Run Code Online (Sandbox Code Playgroud)\n

第四步:运行脚本:修改exe

\n
SET INPUT_EXE=app.exe\nSET OUTPUT_EXE=app.exe\nResourceHacker.exe -open %OUTPUT_EXE% -save %OUTPUT_EXE% ^\n -resource resources.res ^\n -action addoverwrite ^\n -mask VersionInf ^\n -log CONSOLE\n
Run Code Online (Sandbox Code Playgroud)\n

摘要脚本

\n
SET INPUT_EXE=app.exe\nSET OUTPUT_EXE=app.exe\n\nResourceHacker.exe -open resources.rc -save resources.res ^\n -action compile -log CONSOLE\n\nResourceHacker.exe -open %OUTPUT_EXE% -save %OUTPUT_EXE% ^\n -resource resources.res ^\n -action addoverwrite ^\n -mask VersionInf ^\n -log CONSOLE\n
Run Code Online (Sandbox Code Playgroud)\n

参考

\n\n