Car*_*arl 101 windows versioning dll exe fileversioninfo
作为构建过程的一部分,我需要为所有已编译的二进制文件设置版本信息.一些二进制文件已经有版本信息(在编译时添加),有些则没有.
我希望能够应用以下信息:
所有这些属性都由构建脚本指定,并且必须在编译后应用.这些是使用C++ Builder 2007编译的标准二进制文件(而不是程序集).
我怎样才能做到这一点?
Uwe*_*ayr 55
虽然它不是批处理过程,但Visual Studio也可以添加/编辑文件资源.
只需在.EXE或.DLL上使用File-> Open-> File.这对于在构建后修复版本信息或将其添加到没有这些资源的文件开始时非常方便.
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)
而已!
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.
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有一个有趣的终端输出,下面的复制/粘贴片段可能会产生一些混乱。
这更像是一个初步步骤,熟悉环境,表明没有时髦的业务正在进行,......
Run Code Online (Sandbox Code Playgroud)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
正如所见,可执行文件没问题,它们运行良好,下面是它们的详细信息(我们关心的)的样子:
资源文件是包含资源的文本文件。资源(简化)具有:
有关更多详细信息,请查看[MS.Docs]:关于资源文件。有许多工具(在现有答案中提到)可以促进资源文件的编辑,例如:
但是,因为它是关于Resource Hacker 的,并且:
我将在这一步中使用它 ( -action extract)
接下来,为了将资源嵌入到.exe ( .dll , ...) 中,必须将其编译为适合PE格式的二进制形式。同样,有很多工具可以实现这一点,但正如您可能猜到的那样,我将坚持使用Resource Hacker ( -action compile)。
Run Code Online (Sandbox Code Playgroud)[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
}
}
Run Code Online (Sandbox Code Playgroud)
这也将由资源黑客( -action addoverwrite) 执行。由于.exe已被复制,因此我将就地编辑它们的资源。
Run Code Online (Sandbox Code Playgroud)[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。
这是一个可选阶段,以确保:
Run Code Online (Sandbox Code Playgroud)[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
以及他们的详细信息:
Oth*_*ide 10
有这个工具ChangeVersion [1]
功能列表(来自网站):
- 命令行界面
- 支持.EXE,.DLL和.RES文件
- 根据版本掩码更新FileVersion和ProductVersion
- 添加/更改/删除版本密钥字符串
- 调整文件标志(调试,特殊,私有等)
- 更新项目文件(.bdsproj | .bpr | .bpk | .dproj)
- 添加/更改主应用程序图标
- 使用带配置的ini文件
- Windows Vista支持(需要提升)
- 易于集成到持续构建环境中
完全披露:我知道写这个工具的人,我曾经和他一起工作过.但这也意味着我知道他制作了高质量的软件;)
[1]链接已经死了.download.cnet.com上似乎有镜像版本.
小智 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)
@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]
我想制作一个更紧凑的版本
\nresource准备资源文件:resource.rc
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}\nRun Code Online (Sandbox Code Playgroud)\n\n有两种方法可以获得它。
\nchoco install reshack -yres成rc文件ResourceHacker.exe -open resources.rc -save resources.res ^\n -action compile -log CONSOLE\nRun Code Online (Sandbox Code Playgroud)\nSET 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\nRun Code Online (Sandbox Code Playgroud)\nSET 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\nRun Code Online (Sandbox Code Playgroud)\nCommand Line Syntax^| 归档时间: |
|
| 查看次数: |
136739 次 |
| 最近记录: |