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

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

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

  • 公司名称
  • 版权告示
  • 产品名称
  • 产品说明
  • 文件版本
  • 产品版本

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

我怎么能这么做?

196239 次浏览

有这个工具 更改版本 [1]

功能一览表(网址:):

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

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


[1] 链接已死,在 Download.cnet.com似乎有镜像版本。

或者你也可以使用免费的 StampVer来获取 Win32 exe/dll 文件。
它只会更改文件和产品版本,但如果它们已经有版本资源。如果版本资源不存在,则不能添加版本资源。

有来自天堂工具软件公司的 资源调谐器控制台

资源调谐器控制台是一个命令行工具,允许开发人员自动编辑大量 Windows 32位和64位可执行文件中的不同资源类型。

有关更详细的信息,请参见 更改版本变量并更新版本信息页面。

像这样的东西怎么样?

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

可用 这里有完整的消息来源

Verpatch 很好,但是不能处理 Unicode 字符..。
请尝试 < a href = “ https://github.com/dblock/resource celib”rel = “ norefrer”> ResourceLib

与其他许多答案不同,这个解决方案使用完全自由的软件。

首先,像下面这样创建一个名为 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 模式下使用 资源黑客将其添加到现有的 .exe:

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

就是这样!

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

参见: 资源编辑 by 安德斯 · 梅兰德

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

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

有点晚了,但是因为我正在寻找它(我可能需要在某个时候再次找到它) ,下面是我在 VS2013 Express 下面的 C + + DLL 中加入版本、公司名称等内容所做的工作:

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

希望这个能帮上忙!

Rcedit 是相对较新的命令行,可以很好地工作: < a href = “ https://github.com/atom/rcedit”rel = “ norefrer”> 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"

还有一个从 JavaScript 包装它的 NPM 模块和一个使用 Grunt 的 繁重的工作

我没有使用任何附加工具。我只是将以下文件添加到我的 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

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

(或)

您可以从下载链接 < a href = “ http://blog.dixo.net/downloads/stampver/”rel = “ nofollow norefrer”> 下载 资源加盖印花-Win32版本 这对于 windows.exe 文件非常有用。

(或)

您可以使用名为 RCEDIT的命令工具。从 Github Source 链接下载,然后使用 VisualStudio2015进行生成,然后您就可以使用特定的命令更改。Exe 文件。有关各种可用命令,请参见 文件链接

有多种工具,许多伟大的答案提到,我将选择其中之一。

资源黑客

我从 资源黑客下载了最新版本(5.1.7)。所有需要的信息都可以在该页面上找到(命令行选项、脚本、 ...)。在下面的演练中,我将对2个可执行文件(实验室小白鼠)进行操作,这些文件(出于显而易见的原因)已经复制到我的 CWD中:

  • ResourceHacker.exe : 我认为对自己进行操作会很有趣
  • 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-Initial

2. 资源

资源文件是包含资源的文本文件:

  • 姓名
  • 类型
  • 价值

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

  • VStudio 在启动新项目时创建一个默认项
  • 可以手动创建这样的文件
  • 但是,因为它是关于 资源黑客的,而且:

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

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

接下来,为了将资源嵌入到 。 exe(。 dll,...)中,它必须是 编译完毕到二进制形式,这适合于 体育课格式。同样,有很多工具可以实现这一点,但正如您可能猜到的那样,我将坚持使用 资源黑客(-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. 嵌入

这也将由 资源黑客(-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-Final

“丹尼 · 贝克特”的 以上答案帮了我很大的忙,

我把下面的文件放在一个批处理文件,我把它放在同一个文件夹里的资源黑客和 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 ]

我想做一个更紧凑的版本

  • 步骤1: 创建资源
  • 步骤2: 下载 ResourceHacker
  • 步骤3: 将 res 编译为 rc 文件
  • 步骤4: 运行 script: 修改 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. 巧克力味的下载:
    • 装巧克力
    • choco install reshack -y
    • 安装后,可能需要添加环境变量。
  2. 资源黑客网站

步骤3: 将 res编译为 rc文件

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

步骤4: 运行 script: 修改 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

参考文献