Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何修改cpp文件中的VS_版本_信息_C++_Visual Studio - Fatal编程技术网

C++ 如何修改cpp文件中的VS_版本_信息

C++ 如何修改cpp文件中的VS_版本_信息,c++,visual-studio,C++,Visual Studio,当我进入资源视图->myproject.rc->Version->VS\u Version\u INFO时,我已经得到了可以更改的字段。是否可以通过cpp文件更改这些字段?因此,我可以使用类似于: #define FileDescription "This is my program" 这很酷,因为总是去那里更改这些字段很烦人。您可以直接在文本编辑器中编辑resource file.rc和resource.h文件。但是先关闭资源查看器。您可以使用,UpdateResource,EndUpdat

当我进入资源视图->myproject.rc->Version->VS\u Version\u INFO时,我已经得到了可以更改的字段。是否可以通过cpp文件更改这些字段?因此,我可以使用类似于:

#define FileDescription "This is my program"

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

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

您可以使用,
UpdateResource
EndUpdateResource
API修改已构建二进制文件上的资源

如果您想自动更新,另一个选项是使用包装上述API并公开脚本友好的COM接口的方法

Image=newActiveXObject(“AlaxInfoResourceTools.Image”);
初始化(“C:\\Sample.dll”);
Echo(“产品版本:”+Image.VersionInfo.ProductVersionString);
Echo(“文件版本:”+Image.VersionInfo.FileVersionString);
var ProductName=Image.VersionInfo.GetString(0,“ProductName”);
var OemProductName=Image.VersionInfo.GetString(0,“OemProductName”);
Echo(“产品名称:+ProductName”);
Echo(“OemProductName:+OemProductName”);
Image.VersionInfo.SetString(0,“OemProductName”、“/”+ProductName);
Image.VersionInfo.Update();
Image.EndUpdate(false);

如果您正在构建自己,那么最简单的方法当然是直接修改资源脚本,或者使用IDE编辑器,或者直接在
.rc
文件中进行修改。

您不能。版本资源由链接器嵌入到EXE中,它不是变量。Windows知道如何找到它并在“属性”窗口中显示版本。试图用代码修改它在设计上没有用处,当用户查看属性时,它不会运行。也不能修改自己的EXE文件,因为它在程序运行时被锁定。UAC阻止程序修补可执行文件,这是罗曼方法的冰山一角


如果资源编辑器让您感到不安,您不必使用它。rc文件只是一个文本文件,您可以使用文本编辑器进行编辑,就像您的.cpp源代码一样。预处理器首先会对文件进行一次扫描,您可以替换字符串,这样只需编辑.rc文件中包含的.h文件即可完成任务。

只需在rc文件中包含包含信息的标题:

版本1.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
现在,转到资源浏览器,右键单击正在处理的项目的资源文件夹。点击“资源包括”

加:

#将“filever.rc2”包含在“只读符号指令”下的包含列表中

这将使filever.rc2文件包含在资源文件中。单击“确定”。将有一个关于进行更改的警告。点击ok继续并进行更改

现在,浏览到资源文件中的“Version”文件夹。 打开该文件夹,右键单击版本条目,然后选择“删除”以删除版本条目。如果不将其删除,将有一个重复的资源,因为我们在filever.rc2文件中添加了相同的信息,我们将包括这些信息

版本信息现在将使用filever.rc2中包含的版本。这样它就不会自动生成,如果它在项目资源文件中,情况就是这样

此后,当您更改version.h和build中的常量时,嵌入到可执行文件中的版本信息将来自version.h文件

这个解决方案是前面文章中描述的一个例子。希望这澄清了如何实施所建议的内容

我不确定filever.rc2文件上的“.rc2”扩展名是否有什么神奇之处,但我通过实验发现,如果您将其命名为.rc,它会出现在资源浏览器中,这并不是真正需要的。如果你称它为.h,它在VisualStudio中编辑得不好,因为它试图智能感知它,而它看起来大多像是错误。rc2似乎能让每个人都开心,而且不会产生副作用


干杯。

我不知道你说的“UAC停止…”是什么意思。它不会停止,通过内置二进制文件上的
UpdateResource
更新不会出现问题。只有当更新破坏了数字签名(完整性)时,问题才可能出现,在这种情况下,需要对可执行文件进行重新签名才能修复。我认为这个答案是令人困惑的多余。最后一句回答了OP的问题(但最好举个例子);其余的都不相关,也没有必要。不可能让每个人都高兴:(在你回答了10万个问题后回来,我们会比较笔记。