如何从cpp文件中修改VS_VERSION_INFO ?
How can I modify VS_VERSION_INFO from the cpp file
当我转到资源视图->我的项目。rc -> Version -> VS_VERSION_INFO我已经得到了我可以改变的字段。可以通过cpp文件更改这些字段吗?所以我可以使用如下代码:
#define FileDescription "This is my program"
这很酷,因为总是去那里修改这些字段很烦人。
在项目中创建一个名为"filever "的文件。
filever。Rc2应该像这样:
#include "version.h"
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILE_VERSION
PRODUCTVERSION VER_PRODUCT_VERSION
FILEFLAGSMASK 0x3fL
FILEFLAGS VER_FILEFLAGS
FILEOS VER_FILEOS
FILETYPE VER_FILETYPE
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", VER_COMPANY_STR " "
VALUE "FileDescription", "Your Application"
VALUE "FileVersion", VER_FILE_VERSION_STR " "
VALUE "InternalName", "Your"
VALUE "LegalCopyright", VER_COPYRIGHT_STR " "
VALUE "LegalTrademarks", VER_TRADEMARK_STR " "
VALUE "OriginalFilename", "Your.exe"
VALUE "ProductName", "Your Application"
VALUE "ProductVersion", VER_PRODUCT_VERSION_STR " "
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
filver中的信息。Rc2 '是从为项目自动生成的.rc文件中复制粘贴出来的。然后将其修改为使用已定义的标识符。#include "version.h"将是定义的来源。该文件可以是应用程序的一部分,您可以在其中修改visual studio的版本信息。
在文件"version.h"中,添加如下内容:
#define VERSION_YEAR 16 // 2 digit year
#define VERSION_MONTH 4 // 2 digit month
#define VERSION_DAY 22 // 2 digit day
#define VERSION_UNSAFE 0 // 0 = TESTED, 1 = UNSAFE / IN DEVELOPMENT
#define VER_COPYRIGHT_STR "Copyright (C) 1999 - 2016"
#define VER_TRADEMARK_STR "Your Trademark"
#define VER_COMPANY_STR "Your Company"
#define STRINGIZE2(s) #s
#define STRINGIZE(s) STRINGIZE2(s)
#if (VERSION_UNSAFE == 1)
#define MY_VERSION_NUM STRINGIZE(VERSION_YEAR) STRINGIZE(VERSION_MONTH) "." STRINGIZE(VERSION_DAY) STRINGIZE(VERSION_UNSAFE)
#else
#define MY_VERSION_NUM STRINGIZE(VERSION_YEAR) STRINGIZE(VERSION_MONTH) "." STRINGIZE(VERSION_DAY)
#endif
#define VER_FILE_VERSION VERSION_YEAR, VERSION_MONTH, VERSION_DAY, VERSION_UNSAFE
#define VER_FILE_VERSION_STR STRINGIZE(VERSION_YEAR) "." STRINGIZE(VERSION_MONTH) "." STRINGIZE(VERSION_DAY) "." STRINGIZE(VERSION_UNSAFE)
#define VER_PRODUCT_VERSION VER_FILE_VERSION
#define VER_PRODUCT_VERSION_STR VER_FILE_VERSION_STR
#ifdef _DEBUG
#define VER_VER_DEBUG VS_FF_DEBUG
#else
#define VER_VER_DEBUG 0
#endif
#define VER_FILEOS VOS_NT_WINDOWS32
#define VER_FILEFLAGS VER_VER_DEBUG
#define VER_FILETYPE VFT_APP
现在,转到资源浏览器,右键单击您正在处理的项目的资源文件夹。点击"资源包含"
添加:
#include "filever.rc2"
到"只读符号指令"下的包含列表。
这将获得文件。Rc2文件包含到资源文件中。单击OK。将会有一个关于更改的警告。点击ok继续修改。
现在,浏览到资源文件中的"Version"文件夹。打开该文件夹,右键单击版本条目,并选择delete以删除版本条目。如果没有删除,将会有一个重复的资源,因为我们在filver中添加了相同的信息。Rc2文件,我们正在包括。
版本信息现在将使用filever.rc2中包含的版本。这样,它就不会自动生成,如果它在项目资源文件中,就会出现这种情况。
从那时起,当您更改version.h和build中的常量时,嵌入到可执行文件中的版本信息将来自version.h文件。
这个解决方案是前面文章中描述的一个例子。希望这能澄清如何实现建议。
我不确定有什么神奇的'。Rc2 '的扩展名。但是我通过实验发现,如果将它命名为。rc,它会出现在资源浏览器中,这是不可取的。如果你把它命名为。h,它在visual studio中无法很好地编辑,因为它试图智能感知它,而且它看起来大多像错误。把它命名为。rc2似乎让每个人都很高兴,而且没有副作用。
欢呼。
您可以直接在文本编辑器中编辑资源文件.rc和resource.h文件。但是先关闭资源查看器
你不能。版本资源通过链接器嵌入到EXE中,它不是一个变量。Windows知道如何查找它并在"属性"窗口中显示版本。试图用代码修改它在设计上是没有用的,当用户查看属性时它不会运行。你也不能修改你自己的EXE文件,当你的程序正在运行时,它被锁定。UAC阻止程序对可执行文件进行修补,这是摧毁Roman方法的冰山。
你不必使用资源编辑器,如果它惹恼了你,.rc文件只是一个文本文件,你可以用文本编辑器编辑,就像你的。cpp源代码。预处理器首先对文件进行处理,您可以替换字符串,这样只需编辑。rc文件#包含的。h文件也可以完成这项工作。
只需在rc文件中包含包含您的信息的头文件:
version1.h:
#define RELEASE_VER 1 // 0: beta version; 1: release version
#define RELEASE_DATE "May 09 2013" // Mmm dd yyyy; only used for RELEASE_VER=1
#define RELEASE_VER_MAIN 3 // version number (binary)
#define RELEASE_VER_MAIN2 0
#define RELEASE_VER_SUB 4
#define RELEASE_VER_SUB2 0
// version number (string)
#define TOSTRING2(arg) #arg
#define TOSTRING(arg) TOSTRING2(arg)
#define RELEASE_VER_STR TOSTRING(RELEASE_VER_MAIN)"."TOSTRING(RELEASE_VER_MAIN2)"."
TOSTRING(RELEASE_VER_SUB)"."TOSTRING(RELEASE_VER_SUB2)
myapp.rc
#include "winver.h"
#include "../../core/version1.h"
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
1 ICON "mayapp.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
1 VERSIONINFO
FILEVERSION RELEASE_VER_MAIN,RELEASE_VER_MAIN2,RELEASE_VER_SUB,RELEASE_VER_SUB2
PRODUCTVERSION RELEASE_VER_MAIN,RELEASE_VER_MAIN2,RELEASE_VER_SUB,RELEASE_VER_SUB2
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "Comments", " "
VALUE "CompanyName", "Developed by xxx "
VALUE "FileDescription", "mayapp super "
VALUE "FileVersion", RELEASE_VER_STR
VALUE "InternalName", "mayapp "
VALUE "LegalCopyright", "Copyright (c) by my "
VALUE "LegalTrademarks", " "
VALUE "OriginalFilename", "mayapp "
VALUE "PrivateBuild", " "
VALUE "ProductName", "mayapp "
VALUE "ProductVersion", RELEASE_VER_STR
VALUE "SpecialBuild", " "
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
您可以使用BeginUpdateResource
, UpdateResource
, EndUpdateResource
API修改已经构建的二进制文件的资源。
如果你想自动化更新,另一个选择是使用这个工具,它包装了上面提到的API,并暴露了脚本友好的COM接口。
Image = new ActiveXObject(“AlaxInfoResourceTools.Image”);
Image.Initialize(“C:\Sample.dll”);
WScript.Echo(“Product Version: ” + Image.VersionInfo.ProductVersionString);
WScript.Echo(“File Version: ” + Image.VersionInfo.FileVersionString);
var ProductName = Image.VersionInfo.GetString(0, “ProductName”);
var OemProductName = Image.VersionInfo.GetString(0, “OemProductName”);
WScript.Echo(“ProductName: ” + ProductName);
WScript.Echo(“OemProductName: ” + OemProductName);
Image.VersionInfo.SetString(0, “OemProductName”, “// ” + ProductName);
Image.VersionInfo.Update();
Image.EndUpdate(false);
如果您正在自己构建,那么最简单的方法当然是直接修改资源脚本,要么使用IDE编辑器,要么直接在.rc
文件中修改。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 数据成员SFINAE的C++17测试:gcc vs clang
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 正在VS调试器中监视映射条目
- Confusion: decltype vs std::function
- 将IBM Rhapsody模型集成到VS 2019中
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 修改 VS Code 中的默认C++代码段
- 如何使用c++在VS 2019上运行SQL查询
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 完美前进使用 std::forward vs RefRefCast
- 从VS 2015更新3更新到VS2015更新3 d后浮点计算行为不同的原因
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- C++ Version Of Double.longBitsToDouble
- consteval wrapper vs. source_location