【问题标题】:Delphi adding and using multiple resource files *.RES inside exe/dllDelphi在exe/dll中添加和使用多个资源文件*.RES
【发布时间】:2013-05-03 20:06:52
【问题描述】:

我对在 delphi 中使用 *.RES 文件有疑问。

例如我有两个资源文件:1.RES 和 2.RES。这两个 RES 文件都包含名为 IMAGE1 (jpg) 的不同图像。

我使用这些命令将 RES 文件添加到 Delphi 应用程序:

{$R '1.RES'}
{$R '2.RES'}

如何指定要使用的资源文件? 如果我只有一个 RES 文件,我想检索图像时使用这些命令:

var RS : TResourceStream;
    jpg : TjpegImage;

RS := TResourceStream.Create(HInstance,'IMAGE1',RT_RCDATA);
jpg.LoadFromStream(RS);

现在,如果我有 2 个 RES 文件,我怎么知道它会加载什么? 我想我需要控制 HInstance,但我就是不知道如何控制。

【问题讨论】:

  • 因为您用exedll 标签标记了您的问题,我假设您在exe 中有一个资源,而在dll 中有另一个资源?在这种情况下是的,模块的HInstance 就是“答案”。
  • @ain 两个相邻的$R 声明不建议
  • 在这种情况下,链接器传递是否应该产生关于“重复资源”的错误消息?

标签: windows delphi


【解决方案1】:

给定模块中的资源名称必须是唯一的,就像函数中的变量必须具有唯一的名称一样,目录中的文件必须具有唯一的名称等等。所以,如果你把两个同名的资源放到同一个模块中,一个资源将被丢弃,你将只能检索剩余的资源。

如果您不清楚模块是什么,我将尝试解释。模块是 DLL 或可执行文件,或 Delphi 包。您的可执行文件是单个模块,具有单个实例句柄。它链接到 DLL,每个 DLL 都是独立的不同模块。您的可执行文件加载的任何包也是不同的模块。您可以在其他模块中拥有与可执行文件中的资源同名的资源。

我想我需要控制HInstance,但我就是不知道怎么做。

这无济于事,我希望你现在明白了。值HInstance 标识模块,在您的代码中它指的是与可执行文件关联的模块。

您的选择:

  1. 为资源指定不同的名称。
  2. 将资源放入不同的模块中。

【讨论】:

  • 所以我必须制作更多的 dll。感谢您的快速回答:)
  • 或者使用不同的名称。这就是我会做的。
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 2011-01-20
  • 2012-02-20
相关资源
最近更新 更多