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


113

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

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

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

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

我怎样才能做到这一点?


ResourceHacker有什么用?任务的确切设置方式是什么?在什么问题中使用UpdateResource功能,如果现有pe中的任务更新版本
RbMm

试试这个:Alternativeto.net/software/xn-resource-editor,我认为有反向工程工具可以做到这一点
i_thamary

Answers:


59

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

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


8
当我尝试过时,这非常完美。对于完全缺少版本信息的文件:在Visual Studio中打开DLL后,转到“编辑”>“添加资源”>“版本”,然后单击“新建”。然后在新的“版本”选项卡中,更改FILEVERSION和PRODUCTVERSION,CompanyName等。保存文件,一切就绪!
twasbrillig 2014年

2
@UweBaemayr。您引用的答案与我可以进行自动化的方式一样,我们是否可以使其自动化?但是如何?
SteveScm 2014年

1
对于我的旧的Delphi win32 dll,这不起作用。完全正确地更改了dll信息,在对其进行运行状况检查时,您意识到它已损坏。
sthiers

3
在Windows 8,VS 2015上对此进行了尝试(添加版本信息),并且在Windows资源管理器中一切正常,除了...该可执行文件不再启动。
Liviu

36

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

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

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

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

而已!


1
@CharlesB我自己也注意到了,但这是正确的链接。好像有人忘记支付他们的虚拟主机!这是二进制文件,我已将其镜像到我的公共Assembla帐户:assembla.com/code/danny-beckett/subversion/nodes/13/GoRC.exe
Danny Beckett 2013年

3
您也可以使用Microsoft 资源编译器代替GoRC。Windows SDK提供了该功能。
整体开发人员

对Resource Hacker表示赞许,我在此答案中使用了它,它是出色的出色程序。(与程序或制造商没有亲和力;-)
user2109254

@UweKeim我已经有一段时间没有使用它了,但是我很确定他们是必需的。
丹尼·贝克特

6
似乎命令行有所更改: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
YusufTarıkGünaydın

23

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


19

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。


5
请注意,rcedit只能修改现有资源,而不能插入新资源
Bevan Collins

2
不适用于7zip sfx归档文件:/仅切出7zip归档文件部分。
Mgamerz '18

1
尝试过这个,在相同目录中时,总是给出无法加载文件的提示,似乎该工具可能取决于主机配置
Arijoon

与7zS.sfx存根一起使用,这是内部包含VERSIONINFO的第一部分,您可以使用该部分将一个自解压的归档文件组合在一起。您也可以手动在7zS.exe中重命名7zS.sfx并在Visual Studio中对其进行编辑,但是由于每个构建的版本号都在变化,因此您希望使用带有rcedit语句的批处理文件进行设置。
AndresRohrAtlasInformatik

1
该工具非常讨厌,请在将其应用到您的二进制文件之前先查看此错误:github.com/electron/rcedit/issues/51
Brun

14

那这样的东西呢?

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

在此处获得完整资源


Verpatch似乎为我创建了一个不好的产品版本资源(使用该/va /pv选项)。该版本在Windows资源管理器中正确显示,但是使用检索代码时缺少最后一个字符VerQueryValue。要修复不良资源,我这样做:(1)​​在Resource Hacker中加载DLL。(2)查看版本资源。(3)编译(修改某些内容然后将其更改回启用按钮)。(4)保存。
dan-gph 2013年

verpatch在我的开发箱上对我的DLL的x64和x86版本都适用,但是在apveyor构建项目中,它仅适用于x64,并且对x86 dll也没有任何作用-也不出错!任何提示可能会发生什么?我可以在appveyor日志中看到verpatch命令正在执行,没有错误,并且dll没有以某种方式被替换,并且最终它没有版本标记;对于x64,在所有情况下都可以正常工作。有什么线索吗?
Ovi)

@ Ovi-Wan Kenobi:我不知道什么是输送机,但是根据您的描述,在我看来,它更像是输送机问题。最糟糕的情况是,如果可能的话,准备在apveyor环境中进行一些调试吗?...
filofel

10

有这个工具ChangeVersion [1]

功能列表(来自网站):

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

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


[1]链接无效。在download.cnet.com上似乎存在镜像版本。


@Gareth我添加了一个镜像链接。另一方面,我怀疑这个答案是否有任何价值,如果没有任何工作参考。

5
第二个链接导致工具过期"Change Version v2012.9.6.0 - (C)2007-2012 The-Software-Box.com This trial version has expired"
Preet Sangha

2
在命令行中运行时,它说“更改版本v2012.9.6.0-(C)2007-2012 The-Software-Box.com此试用版已过期”
RDeveloper

10

我正在使用其他工具。我刚刚将以下文件添加到我的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

2
只是好奇; 每次更改对话框或修改项目中的任何资源时,如何阻止Windows覆盖.rc文件?到目前为止,我已经看过几篇类似的文章,而且如果您不必再次更改会导致IDE自动生成的资源,则似乎可以使用。
shawn1874 '17

@ shawn1874- #include <windows.h>resource.h自动添加的文件中包含该行。该文件不会重新生成(请注意,.rc文件顶部表示已生成代码,可以在设计器中对其进行修改)。
CJBS

1
@CJBS没有回答问题。尽管这可能有效,但是它不能解释发布的答案如何起作用。在发布的答案中,user3016543直接将version.h包含在.rc文件中。我知道有几种方法可以处理.rc文件的覆盖问题。我只是在质疑显示此特定答案的方式,因为它对我而言不合适。
shawn1874

我猜该方法对他有用,因为所讨论的组件没有对话框组件,因此文件不会或永远不会重新生成。但是,在带有MFC对话框资源的Windows应用程序中,情况并非如此。
shawn1874

1
感谢您让我想起一种技术,该技术是我在WinBatch Extender SDK随附的资源文件中首次看到的。自从我需要它已经很久了,以至于我忘记了大多数细节。您的解释使一切都恢复了。
David A. Gray,


5

有多种工具,有很多很好的答案,我将选择其中一种。

资源黑客

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

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

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已被复制,因此我将就地编辑它们的资源。

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


@ColonelPanic:谢谢!
CristiFati

很好的答案。不幸的是,ResourceHacker不再维护,并在尝试编辑大型EXE文件时耗尽内存(尝试打开3GB exe文件时出现错误)。
Lews Therin

@LewsTherin:最新版本(答案也使用了)是从2019/01开始的,所以我说它已经维护了。问题是它是32bit。您可以联系要求64位版本的作者(我想因为他们已经有了代码,所以对于64位构建它并不难)。
CristiFati


3

聚会晚了一点,但是由于我一直在寻找它(并且可能有时需要再次找到它),因此我在VS2013 Express下将版本,公司名称等包含在我的C ++ DLL中是这样做的:

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

希望这可以帮助!


3

@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]


2

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

(要么)

您可以从下载链接下载StampVer – Win32版本资源标记 ,对于Windows .exe文件确实有用。

(要么)

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.