如何获取Delphi中resourcestring的字符串表资源ID?

6
在Delphi中,您可以声明将字符串存储在模块资源部分的字符串表中。
resourcestring
  rsExample = 'Example';

在编译时,Delphi会为其分配一个ID并将其存储在字符串表中。
是否有一种方法可以检索声明为resourcestring的字符串的ID?
原因是我使用了一个类似于gnugettext的包。 System.pas中的某些函数(如LoadResString)被挂钩,因此当我在表达式中使用resourcestring时,它将被替换为不同的字符串(翻译)。 当然,这非常方便,但有时我需要resourcestring的原始(未翻译)文本。
当我能够检索字符串的资源ID时,我可以调用LoadString API来获取原始文本,而不是翻译后的文本。
1个回答

10

要获取资源字符串的资源 ID,您可以将字符串的地址转换为 PResStringRec 类型,然后访问 Identifier 值。

尝试这个示例

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

resourcestring
  rsExample  = 'Example';
begin
  try
    Writeln(rsExample);
    Writeln(PResStringRec(@rsExample)^.Identifier);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.

啊,谢谢!我不知道resourcestring实际上是指向TResStringRec记录的指针。我在文档中找不到这个信息。当然,这可能是我的错,但你认为这个信息在哪里有记录吗? - R. Beiboer
TResStringRec 文档中写道 ...TResStringRec 代表一个字符串资源。TResStringRec 是一个结构,其中包含字符串资源的模块和标识符。 - RRUZ
TResStringRec文档中,我没有看到resourcestring声明的字符串链接。它说TResStringRec类型的变量由系统例程在运行时用于定位和加载字符串资源。也许它在这个句子中谈到了resourcestrings,但对我来说不太清楚。无论如何,你已经将我引导到了正确的方向! - R. Beiboer

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