2013-05-18 62 views
2

当我去资源视图 - > myproject.rc - >版本 - > VS_VERSION_INFO我有我可以改变的领域。可以通过cpp文件更改这些字段?所以我可以使用类似:如何从cpp文件修改VS_VERSION_INFO

#define FileDescription "This is my program" 

这将是冷静,因为这很烦人总是去那里,更改这些字段。

回答

1

你不能。版本资源由链接器嵌入到EXE中,它不是一个变量。 Windows知道如何找到它并在“属性”窗口中显示版本。尝试使用代码对其进行修改并不是有用的,当用户查看属性时,它不会运行。你也不能修改你自己的EXE文件,它在程序运行时被锁定。 UAC阻止程序修改可执行文件,这是沉浸罗马方法的冰山。

如果你不喜欢使用资源编辑器,那么.rc文件只是一个可以用文本编辑器编辑的文本文件,就像你的.cpp源代码一样。预处理器首先获取文件的一个镜头,您可以替换字符串,只需编辑一个.h文件即可.rc文件包含的.rc文件也可以完成工作。

+0

我不确定您的意思是“UAC停止...”。它不会停止,通过构建的二进制文件上的'UpdateResource'进行更新没有问题。如果更新破坏数字签名(完整性),则问题可能只会出现,在这种情况下,需要重新签署可执行文件才能修复该问题。 –

+0

我认为这个答案是多余的混淆。最后一句回答OP的问题(但以一个例子为例);其余不相关或不必要。 –

+0

不可能让每个人都高兴:(回来之后,你也回答了10K个问题,我们会比较笔记。 –

3

您可以直接在文本编辑器中编辑资源文件.rc和resource.h文件。但首先关闭资源查看器。

0

您可以使用BeginUpdateResourceUpdateResource,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的编辑器,或直接。

0

就包括含有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 
0

在项目中创建一个名为“使用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似乎让每个人都开心,并且不会引起副作用。

干杯。