129

As part of our build process I need to set the version information for all of our compiled binaries. Some of the binaries already have version information (added at compile time) and some do not.

I want to be able to apply the following information:

  • Company Name
  • Copyright Notice
  • Product Name
  • Product Description
  • File Version
  • Product Version

All of these attributes are specified by the build script and must be applied after compilation. These are standard binaries (not assemblies) compiled with C++ Builder 2007.

How can I do this?

4

15 回答 15

73

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

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

于 2014-07-15T19:38:37.597 回答
40

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

首先,创建一个文件,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
    }
}

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

GoRC /fo Resources.res Resources.rc

(请参阅下面我的评论以获取镜像GoRC.exe

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

ResHacker -add MyProg.exe, MyProg.exe, Resources.res,,,

而已!

于 2013-09-17T00:37:43.107 回答
23

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

于 2009-04-30T18:12:27.983 回答
21

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"

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

于 2016-02-03T22:26:01.590 回答
14

这样的事情呢?

verpatch /va foodll.dll %VERSION% %FILEDESCR% %COMPINFO% %PRODINFO% %BUILDINFO%

在此处获取完整资源

于 2010-01-21T18:12:56.867 回答
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

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

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

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

样本.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  
}
}

3.嵌入

这也将由Resource Hacker ( -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

正如所见,我不得不小把戏(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

以及他们的详细信息

Img1-最终

于 2019-01-28T19:37:41.627 回答
11

有这个工具ChangeVersion [1]

功能列表(来自网站):

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

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


[1]链接已失效。download.cnet.com上似乎有镜像版本。

于 2008-11-12T15:47:12.447 回答
11

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

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

----[版本.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

----[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
于 2016-02-16T10:06:00.233 回答
9

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

于 2011-01-19T12:44:46.837 回答
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

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

于 2019-11-05T17:58:16.680 回答
4

聚会有点晚了,但由于我一直在寻找它(有时我可能需要再次找到它),所以我在 VS2013 Express 下的 C++ DLL 中包含版本、公司名称等:

  1. 如前所述,创建并编辑了一个 dllproj.rc 文件。
  2. 在 DLL 项目中添加了“rc.exe dllproj.rc”行作为预构建步骤。
  3. 将 dllproj.res 添加到项目的资源文件夹中。

希望这可以帮助!

于 2015-09-17T18:03:52.433 回答
3

Heaventools Software有Resource Tuner Console

Resource Tuner Console 是一个命令行工具,使开发人员能够自动编辑大量 Windows 32 位和 64 位可执行文件中的不同资源类型。

具体参见更改版本变量和更新版本信息页面以获取更多详细信息。

于 2009-07-10T00:17:15.550 回答
3

您实际上可以尝试从下载链接下载FVIE并尝试编辑任何 .exe 文件的信息。

(或者)

您可以从下载链接下载StampVer – Win32 版本资源标记 ,这对于 windows .exe 文件非常有用。

(或者)

您可以使用名为RCEDIT的命令工具。从Github 源链接下载,然后使用 Visual Studio 2015 构建,然后您有特定的命令来更改 .exe 文件的版本。有关各种可用命令,请参阅文档链接

于 2019-01-28T06:14:01.753 回答
1

这是我见过的最好的工作工具,可以完全控制所有文件资源,包括 VersionInfo。

请参阅:Anders MelanderResourceEditor

于 2014-05-21T15:19:48.077 回答
1

我想组合一个更紧凑的版本

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

第 1 步:创建resource

准备资源文件:resource.rc

VS_VERSION_INFO VERSIONINFO
    FILEVERSION    0,0,0,0
    PRODUCTVERSION 0,0,0,0
{
    BLOCK "StringFileInfo"
    {
        BLOCK "040904b0"
        {
            VALUE "CompanyName",        "\0"
            VALUE "FileDescription",    "\0"
            VALUE "FileVersion",        "0.0.0.0\0"
            VALUE "LegalCopyright",     "© 2020 Carson. All rights reserved.\0"
            VALUE "OriginalFilename",   ".exe\0"
            VALUE "ProductName",        "\0"
            VALUE "ProductVersion",     "0.0.0.0\0"
        }
    }
    BLOCK "VarFileInfo"
    {
        VALUE "Translation", 0x0409, 1200
    }
}

第 2 步:下载 ResourceHacker

有两种方法可以得到它。

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

第三步:编译resrc文件

ResourceHacker.exe -open resources.rc -save resources.res ^
 -action compile -log CONSOLE

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

SET INPUT_EXE=app.exe
SET OUTPUT_EXE=app.exe
ResourceHacker.exe -open %OUTPUT_EXE% -save %OUTPUT_EXE% ^
 -resource resources.res ^
 -action addoverwrite ^
 -mask VersionInf ^
 -log CONSOLE

摘要脚本

SET INPUT_EXE=app.exe
SET OUTPUT_EXE=app.exe

ResourceHacker.exe -open resources.rc -save resources.res ^
 -action compile -log CONSOLE

ResourceHacker.exe -open %OUTPUT_EXE% -save %OUTPUT_EXE% ^
 -resource resources.res ^
 -action addoverwrite ^
 -mask VersionInf ^
 -log CONSOLE

参考

于 2021-03-19T03:58:24.757 回答