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

时间:2008-11-12 15:16:36

标签: windows dll versioning exe fileversioninfo

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

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

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

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

我该怎么做?

16 个答案:

答案 0 :(得分:49)

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

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

答案 1 :(得分:30)

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

首先,创建一个名为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,,,

就是这样!

答案 2 :(得分:22)

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

答案 3 :(得分:16)

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 module来自JavaScript和Grunt task,以防您使用Grunt。

答案 4 :(得分:14)

这样的事情怎么样?

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

可用here with full sources

答案 5 :(得分:10)

有这个工具ChangeVersion [1]

功能列表(来自网站):

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

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


[1] 链接已经死亡。 download.cnet.com处似乎有镜像版本。

答案 6 :(得分:8)

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

答案 7 :(得分:5)

我没有额外的工具。我刚刚将以下文件添加到我的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

---- [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

答案 8 :(得分:2)

来自Heaventools Software的 Resource Tuner Console

  

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

具体请参阅Changing Version Variables And Updating The Version Information页面了解更多详情。

答案 9 :(得分:2)

派对有点晚了,但是因为我正在寻找它(我可能需要在某个时候再次找到它),这就是我所做的将版本,公司名称等包含在我的C ++ DLL中在VS2013下快递:

  1. 创建并编辑了一个dllproj.rc文件,如前所述。
  2. 添加了行&#34; rc.exe dllproj.rc&#34;作为DLL中的预构建步骤 项目
  3. 将dllproj.res添加到项目的资源文件夹中。
  4. 希望这有帮助!

答案 10 :(得分:2)

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

(OR)

您可以从Download Link下载 StampVer – Win32版本资源标记  对于Windows .exe文件确实非常有用。

(OR)

您可以使用名为 RCEDIT 的命令工具。从Github Source link下载,然后使用Visual Studio 2015进行构建,然后您具有用于更改.exe文件版本的特定命令。有关各种可用命令,请参见Docs link

答案 11 :(得分:1)

这是我在工作中看到的最好的工具,允许完全控制所有文件资源,包括VersionInfo。

请参阅ResourceEditor Anders Melander

答案 12 :(得分:1)

资源黑客

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

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

在继续之前,我想提到 ResourceHacker 具有有趣的终端输出,并且以下复制/粘贴片段可能会引起一些混乱。

>

1。设置

这更像是迈出了初步的一步,熟悉了环境,表明没有时髦的生意在进行...

e:\Work\Dev\StackOverflow\q000284258>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

e:\Work\Dev\StackOverflow\q000284258>set PATH=%PATH%;c:\Install\x64\CMake\CMake\3.6.3\bin

e:\Work\Dev\StackOverflow\q000284258>.\cmake --help >nul 2>&1

e:\Work\Dev\StackOverflow\q000284258>echo %errorlevel%
0

e:\Work\Dev\StackOverflow\q000284258>.\ResourceHacker.exe -help

e:\Work\Dev\StackOverflow\q000284258>

==================================
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.




e:\Work\Dev\StackOverflow\q000284258>echo %errorlevel%
0

如图所示,可执行文件运行良好,可以正常运行,这是我们关心的 Details 的样子:

Img0-Initial

2。资源

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

  • 名称
  • 类型

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

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

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

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

接下来,为了将资源嵌入到 .exe .dll ,...)中,必须对其进行编译转换为二进制格式,适合 PE 格式。同样,有很多工具可以实现这一目标,但是您可能猜到我会坚持使用 Resource Hacker -action compile)。

e:\Work\Dev\StackOverflow\q000284258>:: Extract the resources into a file
e:\Work\Dev\StackOverflow\q000284258>.\ResourceHacker.exe -open .\ResourceHacker.exe -save .\sample.rc -action extract -mask VersionInfo,, -log con

e:\Work\Dev\StackOverflow\q000284258>

[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!

e:\Work\Dev\StackOverflow\q000284258>:: Modify the resource file and set our own values
e:\Work\Dev\StackOverflow\q000284258>
e:\Work\Dev\StackOverflow\q000284258>:: Compile the resource file
e:\Work\Dev\StackOverflow\q000284258>.\ResourceHacker.exe -open .\sample.rc -save .\sample.res -action compile -log con

e:\Work\Dev\StackOverflow\q000284258>

[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!

e:\Work\Dev\StackOverflow\q000284258>dir /b
cmake.exe
ResourceHacker.exe
ResourceHacker.ini
sample.rc
sample.res

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

sample.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 已被复制,因此我将在适当位置编辑其资源。

e:\Work\Dev\StackOverflow\q000284258>.\ResourceHacker.exe -open .\cmake.exe -save .\cmake.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

e:\Work\Dev\StackOverflow\q000284258>

[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!

e:\Work\Dev\StackOverflow\q000284258>copy ResourceHacker.exe ResourceHackerTemp.exe
        1 file(s) copied.

e:\Work\Dev\StackOverflow\q000284258>.\ResourceHackerTemp.exe -open .\ResourceHacker.exe -save .\ResourceHacker.exe -res .\sample.res -action addoverwrite -mask VersionInfo,, -log con

e:\Work\Dev\StackOverflow\q000284258>

[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!

e:\Work\Dev\StackOverflow\q000284258>del /f /q ResourceHackerTemp.*

e:\Work\Dev\StackOverflow\q000284258>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。测试

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

  • 可执行文件仍然有效(在执行过程中没有弄乱它们)
  • 资源已添加/更新
e:\Work\Dev\StackOverflow\q000284258>.\cmake --help >nul 2>&1

e:\Work\Dev\StackOverflow\q000284258>echo %errorlevel%
0

e:\Work\Dev\StackOverflow\q000284258>.\ResourceHacker.exe -help

e:\Work\Dev\StackOverflow\q000284258>

==================================
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.




e:\Work\Dev\StackOverflow\q000284258>echo %errorlevel%
0

及其详细信息

Img1-Final

答案 13 :(得分:0)

reverse engineering有许多工具,例如Interactive Disassembler,您可以在其中更改很多信息以使更多工具可以看到以下信息:https://www.apriorit.com/dev-blog/366-software-reverse-engineering-tools。并尝试使用这些工具https://alternativeto.net/software/xn-resource-editor/

答案 14 :(得分:0)

@Danny Beckett的above答案对我有很大帮助, 我把它放在批处理文件中,效果很好

    @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
    set newVersion=%newVersion%
    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]

答案 15 :(得分:0)

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

  • 第一步:创建资源
  • 第 2 步:下载 ResourceHacker
  • 第 3 步:将 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下载:
    • install choco
    • choco install reshack -y
    • 安装后,您可能需要添加环境变量。
  2. ResourceHacker Website

第 3 步:将 res 编译成 rc 文件

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

参考