资源编译器无法在Win32资源脚本中编译枚举语句?

3
我一直在使用Win32的资源脚本。一段时间后,我制作了一个菜单,并在.h头文件中将菜单项ID实现为枚举值。在将头文件包含到资源脚本中并尝试编译项目后,我发现我的资源编译器不支持枚举,只能强制使用#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_

1
通常情况下,你可以让集成开发环境(IDE)来处理它。请注意,标识符(IDs)通常是上下文敏感的,因此重复可能是可以接受的。 - Mark Ransom
让IDE处理它是什么意思?如果IDE偶尔会覆盖它们,为什么你还要自己定义ID呢?或者除了编写普通的资源脚本并让IDE接管之外,还有更多的工作吗? - Sam
我的意思是你使用资源编辑器,它可以为你修改文件,而无需你管理它们。 - Mark Ransom
哦,我明白了,谢谢。所以我想自己做所有的事情,选择了一条艰难的路 :) - Sam
请注意,如果您使用的是Visual Studio Express,则不包括资源编辑器,因此您别无选择,只能自己编写。 - Jonathan Potter
1个回答

4

资源编译器对C或C++一无所知。脚本只是通过C预处理器(使用RC_INVOKED定义)传递,然后资源编译器使用结果。资源脚本语言(例如字符串文字)与C非常不同。

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

对于C或C++方面(仅限),您可以使用由宏符号指定的值定义枚举,但我认为这没有太大优势。至少我想不到任何优势。


那么在资源脚本中定义具有不同值的大量常量没有方便的方法吗?我还不明白为什么不能更容易地实现这一点... - Sam
@Sam:像Visual Studio这样的IDE(不包括Express版本)可以自动生成和定义常量。VS的缺点是它会创建糟糕的资源脚本。但只要你仅使用VS,通常不需要处理资源脚本。 - Cheers and hth. - Alf

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