编译rc文件时遇到“expected exponent value”错误

4

我有一个rc条目:

{CC6C210B-2EAC-4F6C-89E7-0D2FEFFCE278}  8000  "MyFile.txt"

当我使用cgrc.exe或brcc32.exe编译rc文件时,遇到了以下错误:
[BRCC32 Error] system.core.rc(1): expected exponent value, not 'a'

由于资源名称“CC6C210B-2EAC”被解释为指数值(-2EA),因此出现了这种情况。在-2E之后的字符A不是有效的指数值。
如果我将rc条目更改为类似以下内容:
{CC6C210B-2E2C-4F6C-89E7-0D2FEFFCE278}  8000  "MyFile.txt"

资源编译没有任何错误。
不幸的是,我不能简单地更改资源名称,因为它已被广泛使用。有没有办法让rc不将资源名称解释为指数值?
2个回答

0

我不太确定将GUID用作资源名称是否是一个好主意。如果你真的想这样做,你可能需要将其“编码”为“普通”的标识符,例如:

_CC6C210B_2EAC_4F6C_89E7_0D2FEFFCE278  8000  "MyFile.txt"

你只需要编写一组简单的例程来在普通 GUID 字符串和“编码”形式之间进行值的“编码”和“解码”。

function DecodeToGUID(const renamedGUID: string): string;
begin
  Result := '{' + Copy(ReplaceString(renamedGUID, '_', '-', [rfReplaceAll]), 2, MaxInt)) + '}';
end;

其他例程的实现就留给你的想象力了。;-)


更新

如果你用引号把ID括起来,它应该可以通过rc.exe编译。如果没有引号,资源编译器将把它视为预处理指令,并变得非常混乱:

"{CC6C210B-2EAC-4F6C-89E7-0D2FEFFCE278}"  8000  "MyFile.txt"

我已经使用了Microsoft的rc.exe进行测试。Embarcadero的brcc32.exe仍然会出现错误:

错误 resrc.rc 1 1:期望资源名称或资源类型名称

因此,如果您想要使用它,或者使用IDE的内置资源编译器,您将不得不像上面描述的那样使用重命名的GUID。


@David:这只是一个字符串,但你看看会发生什么。我会坚持使用通常的_、A-Z、0-9方案,以确保安全。 - Rudy Velthuis
我更喜欢使用IDE中的工具。将.rc文件添加到您的Delphi项目中,它将自动编译。为什么要使用属于另一个编译器的命令行工具呢? - Rudy Velthuis
就此而言,我刚刚尝试了使用微软的RC.exe,结果我得到了相同的错误。因此,好吧,GUID字符串可能不是一个好主意:resrc.rc(1) : error RC2021: expected exponent value, not 'A' C:\Users\Administrator\RCa04016(2) : fatal error RC1116: RC terminating after preprocessor errors - Rudy Velthuis
@David:你是指编写自己的资源编译器吗?我认为不接受相对不常见的标识符名称并不是一个大问题。 - Rudy Velthuis
1
@David:不确定这有什么关系。我们谈论的是ID名称,而不是接受的格式。在Delphi、C、C#等语言中,标识符也有其限制。 - Rudy Velthuis
显示剩余6条评论

0

我建议您使用微软资源编译器rc。根据rc的文档,资源定义的第一个标记应该是名称或16位整数。为什么brcc32想将其解释为实际值,这超出了我的理解。

如果这不起作用,请尝试用引号"而不是'来括起GUID。


Delphi IDE 不直接支持 Microsoft 资源编译器 rc。我将使用 cgrc 或 brcc32。用双引号括起来的 GUID 可以解决我的问题,但似乎有点多余。我想我会坚持使用纯 GUID,避免生成那些有问题的 GUID。对于那些已经存在的 GUID,我会逐个查找并用新的 GUID 替换它们。我认为这是某种资源编译器 bug,超出我们的控制范围。除非我们有 cgrc 或 brcc32 的源代码来修复此 bug。 - Chau Chee Yang
1
使用预构建操作,您可以使用任何工具,无需受限制。很抱歉Rudy和我无法为您提供任何帮助。 - David Heffernan

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