gpt4 book ai didi

visual-studio - 如何阻止 Visual Studio 2015 进行硬编码版本控制

转载 作者:行者123 更新时间:2023-12-04 05:37:19 26 4
gpt4 key购买 nike

我目前正在开发一个可生成可执行文件的 C++ VS2015 项目。

我有一个文件版本.h 这只是定义了一堆数字。

#define VERSION_MAJOR               3
#define VERSION_MINOR 0
#define VERSION_REVISION 0
#define VERSION_BUILD 2
#define VER_FILE_VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_REVISION, VERSION_BUILD
...

这个 版本.h 用于在工程的.rc文件中定义可执行文件的版本信息。

.rc 文件看起来像
#include "resource.h"
#include "version.h"
...
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILE_VERSION
...

所以我的问题是每次我添加这样的资源时 资源.h 修改后,Visual Studio 2015 似乎删除了 .rc 文件中的#include“version.h”,而是硬编码了“version.h”中的所有值。

问题的示例 .rc 文件
#include "resource.h"
...
VS_VERSION_INFO VERSIONINFO
FILEVERSION 3,0,0,2
...

所以我的问题是,我如何阻止 VS2015 这样做?

最佳答案

您实际上无法阻止 Visual Studio 的内置资源编辑器执行此操作。每当您使用资源编辑器(即 GUI)对资源文件中的项目进行更改时,它将重新生成资源文件的代码。这将破坏对资源文件进行的各种手动调整,包括用文字替换符号常量和/或算术,删除有条件定义的代码块,破坏仔细的手动格式化等等。因此,手动编辑资源文件不是一个好主意。

如果您需要能够对资源编辑器不会破坏的资源文件进行手动编辑,那么您可以通过向项目中添加第二个资源文件来实现。按照惯例,这有一个 .rc2延期。 Visual Studio 的资源编辑器永远不会直接编辑这些资源,这意味着所有的编辑都必须手动完成。但是一旦你正确设置它,你放在那里的所有资源仍然会链接到你的二进制文件中,从而使最终结果等效。

这几乎是获得健全版本控制的唯一方法,我在自己的项目中使用它。例如:

//
// MyProj.RC2 - resources Microsoft Visual C++ does not edit directly
//

#ifdef APSTUDIO_INVOKED
#error this file is not editable by Microsoft Visual C++
#endif // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Version
//

#include "Version.h"


VS_VERSION_INFO VERSIONINFO
FILEVERSION VERSION_MYPROJ_MAJOR,VERSION_MYPROJ_MINOR,VERSION_MYPROJ_REVISION,0
PRODUCTVERSION VERSION_MYPROJ_MAJOR,VERSION_MYPROJ_MINOR,VERSION_MYPROJ_REVISION,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x40004L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "Cody Gray"
VALUE "FileDescription", "The World's Greatest Application"
VALUE "FileVersion", VERSION_MYPROJ_FULL
VALUE "InternalName", "MyProj"
VALUE "LegalCopyright", "Copyrights are for suckers!"
VALUE "OriginalFilename", "MyProj.exe"
VALUE "ProductName", "MyProj"
VALUE "ProductVersion", VERSION_MYPROJ_FULL
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

您也可以将其他资源放在这里。例如,在我现在正在处理的一个应用程序中,我有一个对话框资源,我只想链接到“调试”构建(它用于配置内部的、与调试相关的选项)。我尝试用 #ifdef DEBUG 包装对话框的定义。 ,但是资源编辑器在每次运行时都会删除整个 block ,所以这是不行的。相反,我将对话框的定义移到了我的 .rc2 中。文件,将其包裹在 #ifdef 中.我失去了使用资源编辑器编辑它的能力,但我不太在意这一点,因为我可以在需要更改的罕见事件中快速手动编辑它。至少它不会被自动剥离。

最后的关键是得到这个 .rc2文件由资源编辑器编译并链接到您的二进制文件中。为此,您需要编辑主资源文件 ( .rc ),但此更改将被保留。您要编辑的部分是 TEXTINCLUDE资源。在我的 .rc文件,该部分看起来像这样:
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
"Resource.h\0"
END

2 TEXTINCLUDE
BEGIN
"#ifndef APSTUDIO_INVOKED\r\n"
"#include ""TargetVer.h""\r\n"
"#endif\r\n"
"#include ""AfxRes.h""\r\n"
"#include ""VerRsrc.h""\r\n"
"#include ""Version.h""\r\n"
"\0"
END

3 TEXTINCLUDE
BEGIN
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
"LANGUAGE 9, 1\r\n"
"#include ""MyProj.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""AfxRes.rc"" // standard components\r\n"
"#endif\r\n"
"\0"
END

#endif // APSTUDIO_INVOKED

重要的部分是 MyProj.rc2 #包含在第 3 个 TEXTINCLUDE 中部分。每当资源编译器运行时,此处的任何文本都会直接转储到资源文件中,因此在资源文件的末尾,您会看到一个看起来很熟悉的自动生成部分,例如:
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE 9, 1
#include "MyProj.rc2" // non-Microsoft Visual C++ edited resources
#include "AfxRes.rc" // standard components
#endif

/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

值得一提的是,如果您无法从我的示例中弄清楚如何将各个部分组合在一起,Visual Studio 中的 MFC 项目模板会自动为您设置这一切,如 this technical note 中所述。 .

关于visual-studio - 如何阻止 Visual Studio 2015 进行硬编码版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37926134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com