我希望能够应用以下信息:
- 公司名称 - 版权声明 - 产品名称 - 产品描述 - 文件版本 - 产品版本
所有这些属性都由构建脚本指定,并且必须在编译后应用。这些是使用C++ Builder 2007编译的标准二进制文件(而不是程序集)。
我该怎么做?
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
}
}
.res
文件,命令如下:GoRC /fo Resources.res Resources.rc
(请参见下面我的GoRC.exe
镜像评论)
然后使用Resource Hacker的CLI模式将其添加到现有的.exe
中:
ResHacker -add MyProg.exe, MyProg.exe, Resources.res,,,
就是这样!
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
。 - Yusuf Tarık Günaydınrcedit 是相对较新的工具,很好地支持命令行: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"
有许多工具被提到,由许多优秀的答案提供,我将选择其中一个。
我从[AngusJ]: Resource Hacker下载了最新版本(5.1.7)。所有所需信息都可以在该页面上找到(命令行选项、脚本等)。在接下来的演示中,我将操作两个可执行文件(实验鼠),它们(出于明显的原因)已复制到我的cwd中:
在继续之前,我想提到ResourceHacker有一个有趣的终端输出,以下复制/粘贴片段可能会产生一些混乱。
这更像是一个初步步骤,以熟悉环境,展示没有奇怪的事情发生,...
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
)
-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
}
}
这也可以通过 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。
这是一个可选的阶段,以确保:
[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
以及他们的详细信息:
这个问题的解决方案可以是这样吗?
verpatch /va foodll.dll %VERSION% %FILEDESCR% %COMPINFO% %PRODINFO% %BUILDINFO%
完整源代码可以在这里获取。
/va /pv
选项)。该版本在Windows资源管理器中显示正确,但是在使用VerQueryValue
检索时,最后一个字符丢失了。为了修复错误的资源,我做了以下操作:(1)在Resource Hacker中加载DLL。(2)查看版本资源。(3)编译(修改一些内容然后将其改回以启用按钮)。 (4)保存。 - dan-gph我没有使用任何额外的工具。我只是将以下文件添加到我的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
resource.h
文件中包含 #include <windows.h>
行。该文件不会重新生成(请注意,在 .rc 文件顶部指示它是生成的代码,并且可以在设计师中进行修改)。 - CJBS[1]链接失效了,似乎在download.cnet.com上有备份版本。
上面@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]
UpdateResource
函数? - RbMm