当我去资源视图 - > myproject.rc - >版本 - > VS_VERSION_INFO我有我可以改变的领域。可以通过cpp文件更改这些字段?所以我可以使用类似:如何从cpp文件修改VS_VERSION_INFO
#define FileDescription "This is my program"
这将是冷静,因为这很烦人总是去那里,更改这些字段。
当我去资源视图 - > myproject.rc - >版本 - > VS_VERSION_INFO我有我可以改变的领域。可以通过cpp文件更改这些字段?所以我可以使用类似:如何从cpp文件修改VS_VERSION_INFO
#define FileDescription "This is my program"
这将是冷静,因为这很烦人总是去那里,更改这些字段。
你不能。版本资源由链接器嵌入到EXE中,它不是一个变量。 Windows知道如何找到它并在“属性”窗口中显示版本。尝试使用代码对其进行修改并不是有用的,当用户查看属性时,它不会运行。你也不能修改你自己的EXE文件,它在程序运行时被锁定。 UAC阻止程序修改可执行文件,这是沉浸罗马方法的冰山。
如果你不喜欢使用资源编辑器,那么.rc文件只是一个可以用文本编辑器编辑的文本文件,就像你的.cpp源代码一样。预处理器首先获取文件的一个镜头,您可以替换字符串,只需编辑一个.h文件即可.rc文件包含的.rc文件也可以完成工作。
您可以直接在文本编辑器中编辑资源文件.rc和resource.h文件。但首先关闭资源查看器。
您可以使用BeginUpdateResource
,UpdateResource
,EndUpdateResource
API修改已构建二进制文件上的资源。
如果您想自动更新,另一个选择是使用this tool,它包装上面提到的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);
如果您正在构建自己,那么最简单的,如果一定要直接修改资源脚本,无论是在.rc
文件(S)使用IDE的编辑器,或直接。
就包括含有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", "\0"
VALUE "CompanyName", "Developed by xxx\0"
VALUE "FileDescription", "mayapp super\0"
VALUE "FileVersion", RELEASE_VER_STR
VALUE "InternalName", "mayapp\0"
VALUE "LegalCopyright", "Copyright (c) by my\0"
VALUE "LegalTrademarks", "\0"
VALUE "OriginalFilename", "mayapp\0"
VALUE "PrivateBuild", "\0"
VALUE "ProductName", "mayapp\0"
VALUE "ProductVersion", RELEASE_VER_STR
VALUE "SpecialBuild", "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
在项目中创建一个名为“使用Filever .rc2“,例如。
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 "\0"
VALUE "FileDescription", "Your Application"
VALUE "FileVersion", VER_FILE_VERSION_STR "\0"
VALUE "InternalName", "Your"
VALUE "LegalCopyright", VER_COPYRIGHT_STR "\0"
VALUE "LegalTrademarks", VER_TRADEMARK_STR "\0"
VALUE "OriginalFilename", "Your.exe"
VALUE "ProductName", "Your Application"
VALUE "ProductVersion", VER_PRODUCT_VERSION_STR "\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END
在“filever.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"
到包括列表下的“只读符号指令”。
这将获得资源文件中包含的filever.rc2文件。点击确定。将会有关于进行更改的警告。点击确定继续并进行更改。
现在,浏览到资源文件中的“版本”文件夹。 打开该文件夹,右键单击版本条目,然后选择删除以删除版本条目。如果它没有被删除,将会有一个重复的资源,因为我们在filever.rc2文件中添加了相同的信息,这是我们所包含的。
版本信息现在将使用filever.rc2中包含的版本。这样它就不会自动生成,如果它在项目资源文件中就是这种情况。
从此,在更改version.h中的常量和build时,嵌入到可执行文件中的版本信息将来自version.h文件。
该解决方案是前面文章中介绍的示例。希望这可以澄清如何实施建议。
我不确定在filever.rc2文件中'.rc2'扩展名有什么魔力,但是我通过实验发现,如果您将它称为.rc,它就会出现在资源浏览器中,而不是真的很可取。如果你把它叫做.h,它在Visual Studio中不能很好地编辑,因为它试图智能化它,它大多看起来像是错误。调用它.rc2似乎让每个人都开心,并且不会引起副作用。
干杯。
我不确定您的意思是“UAC停止...”。它不会停止,通过构建的二进制文件上的'UpdateResource'进行更新没有问题。如果更新破坏数字签名(完整性),则问题可能只会出现,在这种情况下,需要重新签署可执行文件才能修复该问题。 –
我认为这个答案是多余的混淆。最后一句回答OP的问题(但以一个例子为例);其余不相关或不必要。 –
不可能让每个人都高兴:(回来之后,你也回答了10K个问题,我们会比较笔记。 –