resource.h中的宏有什么作用?

17
当在Visual Studio中创建资源文件时,IDE会自动生成名为resource.h的头文件,并包含以下文本:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by BackupRestore.rc

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        101
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

正如您所看到的,它评论并说它们是“新对象的默认值”。这到底意味着什么?它们是否默认情况下在任何其他地方被引用,如果没有,那么它们将在哪里使用?我正在尝试创建一个最小量的代码和文件的项目,并已经测试删除了resource.h文件,解决方案似乎可以正常构建,因此我想知道它是否必不可少,或者删除它是否会导致未来问题。

总之: resource.h文件及其内容有什么用途? 定义的宏是否默认情况下在其他地方使用? 程序员何时可能引用它们/在代码中使用它们(如果有)? 它们是否必不可少,删除它们是否会导致未来问题?

提前感谢 - 请注意我在C++和宏方面非常新手。


1
Resource.h 包含您项目 .rc 文件中定义的资源 ID。它使您的 Windows 应用程序能够引用其各种资源:对话框布局、图标、位图和本地化文本字符串。 - Michaël Roy
那么如果它被删除了会发生什么?有任何持久的影响吗?我的.rc文件中没有提到任何已定义的宏(以_APS开头的宏)。 - Matt
1
@Matt 它们被 RC 编辑器使用(读取和写入)- 如果对它们进行更改,会破坏您的项目,因为 RC 编辑器在创建资源时将不知道要使用的下一个值。 - Richard Critten
2
Resource.h是您源文件集的重要组成部分。请勿删除!删除_APS_*宏将影响Visual Studio资源管理器,其中包括对话框编辑器、文本资源编辑器等等...如果您需要更新应用程序的外观,则会使您的生活变得痛苦。 - Michaël Roy
我的资源文件仅在查看 DLL 属性时提供其版本。您之前关于“不要删除”的评论仍然有效吗? - Matt
2个回答

15

文档

_APS_NEXT_RESOURCE_VALUE是下一个将用于对话框资源、菜单资源等的符号值。资源符号值的有效范围为10x6FFF

_APS_NEXT_COMMAND_VALUE是下一个将用于命令标识的符号值。命令符号值的有效范围为0x80000xDFFF

_APS_NEXT_CONTROL_VALUE是下一个将用于对话框控件的符号值。对话框控件符号值的有效范围为80xDFFF

_APS_NEXT_SYMED_VALUE是手动使用符号浏览器中的“New”命令分配符号值时将发出的下一个符号值。

因此,如果您在实际的对话框编辑器中,当您按下新按钮(例如)时,它就会跟踪下一个可用的资源ID。资源ID通常用于跟踪静态文本(例如用于字段标签)、绑定等。

如果您定义了一个资源ID,它必须是小于_APS_NEXT的任何值。例如,在您的resource.h中,您可能会有

#define IDC_SOME_RADIO_BUTTON    1056

然后稍后你需要更新

#define _APS_NEXT_CONTROL_VALUE       1057

这样做是为了下次点击按钮时它可以获取唯一的ID。它们必须是唯一的,因为它们只是预处理器宏,在您尝试使用该资源ID进行某些操作时将被替换。例如:

void HandleRadioButtion()
{
    // do something important
}

然后,您可以使用资源ID将其绑定到函数

BEGIN_MESSAGE_MAP(SomeDlg, CDialog)
    ON_BN_CLICKED(IDC_SOME_RADIO_BUTTON, HandleRadioButton)
END_MESSAGE_MAP()

3
这个链接非常有用,因为在谷歌上输入这些关键词几乎没有任何结果。其他问题呢? - Matt
你的问题有点宽泛,所以很难确切知道你在问什么。我尝试扩展我的答案,以说明如何通常使用资源的示例。如果你当前的问题已经得到了回答,并且你有后续问题,请随时创建一个新的帖子。Stack Overflow更适合单个问题单个答案的帖子风格。 - Cory Kramer
我快要将这个标记为答案,但我的主要问题实际上是关于资源文件是否必须提供DLL版本的。 - Matt
它们非常重要,但并不是针对版本控制本身。正如提到的那样,它们很重要,以确保您的 .rc 文件一致且正确。随着您添加新资源(如文本字符串、按钮等),resource.h 文件有助于确保所有资源 ID 都是唯一的。 - Cory Kramer
那么如果我不再添加任何内容,删除它就有意义了吗? - Matt
2
@Matt 简洁地说,这两点是:(1)它们只是 #define 宏定义,不会在您的代码中使用,因此不会出现在您的项目中。(2)它们对于资源编辑器的正确功能至关重要,如果您删除它们,很可能会破坏您的项目。鉴于(1)和(2),为什么要去碰它们呢? - Richard Critten

5
那些宏仅供IDE使用。代码本身没有引用它们。
要创建最小的资源文件,您可以跳过使用IDE创建资源,而是从头开始编写它们(作为纯文本文件)。实际上,在IDE启用所有这些自动化之前,就是这样做的。资源文件格式在MSDN中有记录

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接