Reputation: 2523
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:
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?
Upvotes: 142
Views: 229397
Reputation: 8138
I want to put together a more compact version
resource
Prepare the resource file: 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
}
}
There have two methods that can get it.
choco install reshack -y
res
into rc
filesResourceHacker.exe -open resources.rc -save resources.res ^
-action compile -log CONSOLE
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
Command Line Syntax
^
Upvotes: 7
Reputation: 161
the above answer from @DannyBeckett helped me a lot,
I put the following in a batch file & I place it in the same folder where ResourceHacker.exe & the EXE I work on is located & it works excellent. [you may edit it to fit your needs]
@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
[as a side note i used resource hacker also to compile the res file, not GoRC]
Upvotes: 6
Reputation: 41177
There are multiple tools, mentioned by many great answers, I'm going to pick one.
I downloaded latest version (5.1.7) from [AngusJ]: Resource Hacker. All the needed information can be found on that page (command line options, scripts, ...). In the following walkthrough I'm going to operate on 2 executables (lab rats) which (for obvious reasons) I've copied in my cwd:
Before going further, I want to mention that ResourceHacker has a funny terminal output, and the the following copy / paste fragments might generate a bit of confusion.
This is more like a preliminary step, to get acquainted with the environment, to show there's no funky business going on, ...
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
As seen, the executables are OK, they run fine, and here's how their Details (that we care about) look like:
Resource files are text files that contain resources. A resource (simplified) has:
For more details check [MS.Docs]: About Resource Files. There are many tools (mentioned in existing answers) that facilitate resource file editing like:
But, since it's about Resource Hacker, and:
I'm going to use it for this step (-action extract
)
Next, In order for a resource to be embedded into an .exe (.dll, ...) it must be compiled to a binary form, which fits into the PE format. Again, there are lots of tools who can achieve this, but as you probably guessed I'm going to stick to 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
In your case saving and editing the resource file won't be necessary, as the file will already be present, I just did it for demonstrating purposes. Below it's the resource file after being modified (and thus before being compiled).
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
}
}
This will also be performed by Resource Hacker (-action addoverwrite
). Since the .exes are already copied I'm going to edit their resources in place.
[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
As seen, I had to d a little trick (gainarie) as I can't (at least I don't think I can) modify the .exe while in use.
This is an optional phase, to make sure that:
[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
And their Details:
Upvotes: 16
Reputation: 2048
You can actually try downloading FVIE from Download Link and try editing the information for any .exe file.
(OR)
You can download StampVer – Win32 Version Resource Stamping from Download Link which is really usefull for windows .exe files.
(OR)
You could use a command tool called RCEDIT. Download from Github Source link and then build using Visual Studio 2015 and then you have specific commands to change the version of .exe files. See Docs link for various available commands.
Upvotes: 3
Reputation: 149
I'm doing it with no additional tool. I have just added the following files to my Win32 app project.
One header file which defines some constants than we can reuse on our resource file and even on the program code. We only need to maintain one file. Thanks to the Qt team that showed me how to do it on a Qt project, it now also works on my Win32 app.
----[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 [email protected]"
#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
Upvotes: 12
Reputation: 641
Or you could check out the freeware StampVer for Win32 exe/dll files.
It will only change the file and product versions though if they have a version resource already. It cannot add a version resource if one doesn’t exist.
Upvotes: 24
Reputation: 31552
rcedit is relative new and works well from the command line: 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"
There's also an NPM module which wraps it from JavaScript and a Grunt task in case you're using Grunt.
Upvotes: 24
Reputation: 2855
There is this tool ChangeVersion [1]
List of features (from the website):
- command line interface
- support for .EXE, .DLL and .RES files
- update FileVersion and ProductVersion based on a version mask
- add/change/remove version key strings
- adjust file flags (debug, special, private etc)
- update project files ( .bdsproj | .bpr | .bpk | .dproj )
- add/change main application icon
- use ini file with configuration
- Windows Vista support (needs elevation)
- easy to integrate into a continuous build environment
Full Disclosure: I know the guy who wrote this tool, I used to work with him. But this also means that I know he makes quality software ;)
[1] the link is dead. There seems to be mirrored version at download.cnet.com.
Upvotes: 11
Reputation: 131
A little late to the party, but since I was looking for it (and I might need to find it again sometime), here's what I did to include version, company name, etc. into my C++ DLL under VS2013 Express:
Hope this helps!
Upvotes: 4
Reputation: 99
verpatch is good, but doesn't handle unicode characters...
try ResourceLib
Upvotes: 9
Reputation: 2329
While it's not a batch process, Visual Studio can also add/edit file resources.
Just use File->Open->File on the .EXE or .DLL. This is handy for fixing version information post-build, or adding it to files that don't have these resources to begin with.
Upvotes: 85
Reputation: 2170
This is the best tool I've seen for the job, allows full control over all file resources, VersionInfo included.
See: ResourceEditor by Anders Melander.
Upvotes: 1
Reputation: 20846
Unlike many of the other answers, this solution uses completely free software.
Firstly, create a file called Resources.rc
like this:
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
}
}
Next, use GoRC to compile it to a .res
file using:
GoRC /fo Resources.res Resources.rc
(see my comment below for a mirror of GoRC.exe
)
Then use Resource Hacker in CLI mode to add it to an existing .exe
:
ResHacker -add MyProg.exe, MyProg.exe, Resources.res,,,
That's it!
Upvotes: 47
Reputation: 287
There is Resource Tuner Console from Heaventools Software.
Resource Tuner Console is a command-line tool that enables developers to automate editing of different resource types in large numbers of Windows 32- and 64-bit executable files.
See specifically the Changing Version Variables And Updating The Version Information page for greater details.
Upvotes: 3
Reputation: 1378
What about something like this?
verpatch /va foodll.dll %VERSION% %FILEDESCR% %COMPINFO% %PRODINFO% %BUILDINFO%
Available here with full sources.
Upvotes: 15