【问题标题】:What are the macros in resource.h used for?resource.h 中的宏是做什么用的?
【发布时间】:2017-07-24 15:27:12
【问题描述】:

在 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

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

总结: resource.h 文件及其内容是做什么用的? 默认情况下是否在其他地方使用定义的宏? 如果有的话,程序员什么时候可以引用它们/在代码中使用它们? 它们是必不可少的吗?删除它们会造成未来的问题吗?

提前致谢 - 请注意我是 C++ 和宏的新手。

【问题讨论】:

  • Resource.h 包含在项目的 .rc 文件中定义的资源 ID。它允许您的 Windows 应用程序引用其各种资源:对话框布局、图标、位图和本地化文本字符串。
  • 那么如果它被移除会发生什么?有什么持久的影响吗?我的 .rc 文件中没有提到任何已定义的宏(以 _APS 开头的宏)
  • @Matt 它们被 RC 编辑器使用(读取和写入) - 弄乱它们并破坏您的项目,因为 RC 编辑器在创建资源时不知道要使用的下一个值。
  • Resource.h 是源文件集的重要组成部分。不要删除!删除 APS* 宏会影响 Visual Studio 资源管理器,其中包括对话框编辑器、文本资源编辑器等...应用程序。
  • 我的资源文件只是在查看其属性时提供 DLL 的版本。您之前关于“请勿删除”的 cmets 是否仍然有效?

标签: c++ macros resource-files


【解决方案1】:

来自the documentation

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

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

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

_APS_NEXT_SYMED_VALUE 是您在符号浏览器中使用新建命令手动分配符号值时将发出的下一个符号值。

所以本质上,如果您在实际的对话框编辑器中,当您单击一个新按钮时(例如),它就是跟踪下一个可用资源 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()

【讨论】:

  • 这个链接非常有用,因为在谷歌中输入这些内容几乎没有给我任何帮助。其他问题呢?
  • 你的问题有点宽泛,所以很难具体知道你在问什么。我试图扩展我的答案,以说明您一般如何使用资源的示例。如果您当前的问题得到解答并且您有后续问题,请随时创建新帖子。 Stack Overflow 更适合单问题单答案风格的帖子。
  • 我即将将此标记为答案,但我的主要问题实际上是关于它们对于资源文件是否必须提供 DLL 的版本?
  • 它们非常重要,但对版本控制本身而言并不重要。如前所述,它们对于确保您的 .rc 文件一致且正确非常重要。当您添加文本字符串、按钮等新资源时,resource.h 文件有助于确保所有资源 ID 都是唯一的。
  • @Matt conciser 这两点:(1) 它们只是#define(s) 并没有在您的代码中使用,因此您的项目中没有任何结果。 (2) 它们对于资源编辑器的正确运行至关重要,如果您删除它们,您很可能会损坏您的项目。鉴于(1)和(2)为什么要惹他们。
【解决方案2】:

这些宏仅适用于 IDE。代码本身不会在任何地方引用它们。

要创建最少的资源文件,您可以跳过使用 IDE 创建资源,而是从头开始编写它们(作为纯文本文件)。事实上,在 IDE 启用所有这些自动化之前,它就是这样做的。资源文件格式为documented in MSDN

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多