c++ - 资源编译器无法编译 Win32 资源脚本中的枚举语句?

标签 c++ winapi enums compilation resources

我一直在使用 Win32 的资源脚本。一段时间后,我制作了一个菜单,并将菜单项 ID 实现为 .h 头文件中的枚举值。在将头文件包含到资源脚本中并尝试编译项目后,我注意到枚举不适用于我的资源编译器,并且被迫 #define 所有菜单 ID。

我收到的错误:

[Error] Invalid argument

[Resource error] Syntax error (code line in resource script where first enum value occours)

[Resource error] Preprocessing failed

我使用 Dev-C++ 和 windres.exe 作为资源编译器。

我想知道这对于未修改的 IDE 是否正常。是否有一个通用的解决方案,比如向我的 IDE 的 bin 库中添加一个特定的预处理器,或者我是否留下编写我自己的小预处理器? 通常,专业人员如何在不手动跟踪资源 ID 并试图避免“ID 冲突”的情况下做到这一点? 此外,如果 C++ 编译器以某种方式将 #define 宏借用到任何其他涉及的编译过程,这个问题是否会被排除在外?

以下是我尝试过的等效内容:

资源脚本:(resources.rc)

#include <windows.h>
#include <resource.h>

IDR_MYMENU MENU
{
    POPUP "Über..."
    {
        MENUITEM "Dieses Programm", MENU_UEBER_DIESES_PROGRAMM, GRAYED
    }
    POPUP "Einstellungen"
    {
        MENUITEM "Konfiguration", MENU_EINST_KONFIG
        MENUITEM "Optionen", MENU_EINST_OPTIONEN, GRAYED
    }
    POPUP "Daten"
    {
        MENUITEM "Hersteller", MENU_DATEN_HRST
        MENUITEM "Verfahren", MENU_DATEN_VERF, GRAYED
        POPUP "Werkzeuge"
        {
            MENUITEM "Oberwerkzeuge", MENU_DATEN_OW
            MENUITEM "Unterwerkzeuge", MENU_DATEN_UW, GRAYED
        }
        MENUITEM "Werkstoffe", MENU_DATEN_WS, GRAYED
        MENUITEM "Messwerte", MENU_DATEN_MW, GRAYED
    }
    POPUP "Diagnose"
    {
        MENUITEM "Logdatei", MENU_DIAGNOSE_LOGDATEI
        MENUITEM "Letzter Fehlerbericht", MENU_DIAGNOSE_FEHLERBERICHT, GRAYED
    }
    POPUP "Entwickler"
    {
        MENUITEM "XML Import", MENU_ENTW_XML_IMP, GRAYED
        MENUITEM "Konsole anzeigen", MENU_ENTW_KONSOLE, GRAYED
    }
    POPUP "?"
    {
        MENUITEM "Entwickler kontaktieren", MENU_HILFE_ENTW_KONTAKT, GRAYED
        MENUITEM "Readme", MENU_HILFE_README, GRAYED
    }
}

这是一个头文件,正如我所期望的那样简单(resource.h):

#ifndef RESOURCE_H_
#define RESOURCE_H_

// Menu
enum {
IDR_MYMENU = 200,
MENU_UEBER_DIESES_PROGRAMM,

MENU_EINST_KONFIG,
MENU_EINST_OPTIONEN,

MENU_DATEN_HRST,
MENU_DATEN_VERF,
MENU_DATEN_OW,
MENU_DATEN_UW,
MENU_DATEN_WS,
MENU_DATEN_MW,

MENU_DIAGNOSE_LOGDATEI,
MENU_DIAGNOSE_FEHLERBERICHT,

MENU_ENTW_XML_IMP,
MENU_ENTW_KONSOLE,

MENU_HILFE_ENTW_KONTAKT,
MENU_HILFE_README
}

#endif // RESOURCE_H_

这是不方便的头文件,因为我一直在临时修复它:(resource.h)

#ifndef RESOURCE_H_
#define RESOURCE_H_

// Menu
#define IDR_MYMENU 200

// START Menu items
#define MENU_UEBER_DIESES_PROGRAMM 11

#define MENU_EINST_KONFIG 21
#define MENU_EINST_OPTIONEN 22

#define MENU_DATEN_HRST 31
#define MENU_DATEN_VERF 32
#define MENU_DATEN_OW 33
#define MENU_DATEN_UW 34
#define MENU_DATEN_WS 35
#define MENU_DATEN_MW 36

#define MENU_DIAGNOSE_LOGDATEI 41
#define MENU_DIAGNOSE_FEHLERBERICHT 42

#define MENU_ENTW_XML_IMP 51
#define MENU_ENTW_KONSOLE 52

#define MENU_HILFE_ENTW_KONTAKT 61
#define MENU_HILFE_README 62
// END Menu items

#endif // RESOURCE_H_

最佳答案

资源编译器对 C 或 C++ 一无所知。在资源编译器使用结果之前,脚本刚刚通过 C 预处理器(使用 RC_INVOKED 我认为它已定义)。资源脚本语言,例如对于字符串文字,与 C 非常不同。

因此,要定义一个既可以在资源脚本中使用又可以由 C 或 C++ 编译器使用的常量,请使用 #define

对于 C 或 C++ 端(仅),您可以定义一个枚举,其值由宏符号指定,但我认为这没有太大优势。至少我想不出。

关于c++ - 资源编译器无法编译 Win32 资源脚本中的枚举语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25629748/

相关文章:

C++ - 在没有循环的情况下查找稀疏矩阵值

c++ - 重定向的标准输入管道被创建的子进程忽略

c++ - 来自 WM_CHAR 的奇怪输入 - WinAPI

c# - DataGridView 使用基于枚举的 Combobox 列链接到 DataTable

java - 获取枚举字段的值

c++ - 此代码打印的 x 值约为 5000 而不是 10000,这是为什么呢?

c++ - 模板问题 : No matching function for call

swift - 禁止 swift 中间接枚举的一些特定情况

c++ - 'CREATE' 附近偏移量 8 处的 RedisGraph 语法错误

c++ - Win32 FindFirstFile 非终止通配符扩展