如何正确地将资源 (*.res) 文件添加到带有组件的包中?

Posted

技术标签:

【中文标题】如何正确地将资源 (*.res) 文件添加到带有组件的包中?【英文标题】:How to add a resource (*.res) file to the package with components correctly? 【发布时间】:2011-10-13 10:45:37 【问题描述】:

我在单个 .dpk 文件中设置了我自己的 Delphi 组件。我的一个组件需要一些图像才能与它一起分发。我创建了 RES 文件(让它成为“MyImages.RES”),我希望我的可视组件在创建时加载其内容。

如何正确将此 RES 文件添加到 DPK?

当我将 $R 'MyImages.RES' 放入我的 .dpk 文件时,TResourceStream 在创建时失败,因为它无法通过资源名称找到我的图片:

constructor TMyComponent.Create(AOwner: TComponent);
begin
  S := TResourceStream.Create(HInstance, 'MY_PICTURE1', RT_RCDATA);

RES 文件是由这个 RC 创建的:

MY_PICTURE1 RCDATA "my_picture1.png"

【问题讨论】:

一些想法。您是否有单独的设计时包和运行时包,并且 .res 仅链接到设计时包?或者,您是否以某种方式构建了一个不使用运行时包的 exe? @David Heffernan:我有一个用于设计时和运行时的包。这个组件包也和主项目在同一个项目组,会不会导致这样的问题? 尝试在调用TResourceStream.Create之前添加ShowMessage(IntToHex(HInstance, 8))。如果它弹出一个值为00400000 的对话框,那么您是静态链接而不是包。 @David Heffernan:是的,它显示的是 00400000。你能给一些建议如何解决这个问题吗? 【参考方案1】:

直接在声明组件的单元中使用$R 'MyImages.res' 指令。加载资源时,使用FindClassHInstance(TMyComponent)TMyComponent 所在的模块)而不是HInstance(主可执行文件 - 这可能恰好也是TMyComponent 所在的模块,具体取决于您的链接方式)。

编辑:您似乎想与运行时包链接,但实际上您正在将组件静态链接到您的主可执行文件中。显然,您已经编译了运行时(和设计时).bpl 包。要编译使用带有运行时包的组件的主项目(.exe 或 .dll),您应该:

    在项目选项中选择“使用运行时包构建” 将包的基本名称添加到项目选项中的运行时包列表中。

【讨论】:

但是当我将 $R 'MyImages.res' 放入 TMyComponent 模块的实现部分时,主可执行文件无法编译,因为消息“找不到文件'MyImages.res' " 您应该确保 .res 文件位于编译器可以找到的位置。通常,它与 .dcu 位于同一目录中。 是的,将RES文件的路径添加到IDE的主库路径后,它就起作用了。非常感谢 TOndrej 和 David! 注意。对于 c++ buildet,您需要使用: FindClassHInstance(__classid(TMyComponent))【参考方案2】:

从 cmets 到您的问题,很明显您没有在运行时正确链接到包,TMyComponent 被静态链接到您的可执行文件,而不是从包中动态链接。

您可以通过以下两种方式之一解决此问题:

    修复链接问题,以便在运行时确实链接到包。这是在项目 | 中配置的。选项 | Delphi IDE 中的包。 如果您想静态链接,那么您还需要将 .res 文件链接到您的可执行文件。 @TOndrej 的回答提供了一种巧妙的安排方式。

【讨论】:

这应该是组件的一个选项。我的意思是组件应该能够加载它的资源,无论它是否链接到 BPL、DLL 或 EXE,有或没有运行时包。我在下面的回答处理所有情况,因为资源将始终链接到类链接到的同一模块中。 但是如何改变链接的类型呢?当包与我的主要可执行文件在同一个项目组中时是否有可能? @Andrew:只要使用我的答案,它应该在所有情况下都一样。 @Andrew 使用运行时包查看项目 |选项 | IDE 中的软件包。确保选中“使用运行时包构建”。当然,包括我自己在内的许多人更喜欢使用静态链接,但选择权在你。 “使用运行时包构建”应该被选中并且包含在运行时包列表中的包。

以上是关于如何正确地将资源 (*.res) 文件添加到带有组件的包中?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将对象 $push 到 MongoDB 模式属性中,类型:数组

如何正确地将 PyTZ 添加到 Google App Engine 应用程序?

如何正确地将 Kal 框架添加到我的 iPhone 项目中?

如何正确地将库模块依赖项添加到 Flutter Plugin 的 Android 文件夹? [关闭]

如何正确地将元组序列化为键字典

如何正确地将排序模型从我的控制器发送到 Laravel API 资源集合?