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 不将资源名称解释为指数值?

4

2 回答 2

0

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

如果这不起作用,请尝试将 GUID 括在引号中,“而不是 '。

于 2011-08-20T07:10:53.647 回答
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"

我用微软的 rc.exe 对此进行了测试。Embarcadero 的 brcc32.exe 还是会报错:

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

因此,如果您想使用它或 IDE 的内置资源编译器,则必须使用类似上述重命名的 GUID 之类的东西。

于 2011-08-20T06:38:00.517 回答