delphi - 如何在 Delphi 中添加和使用自定义包/组件中的资源?

标签 delphi

我想制作一个使用我的包项目中编译的一些资源的组件。我的组件将尝试在运行时(在其构造函数中)使用此资源(PNG 图像)。

我想在我的应用程序项目中使用它,但是一旦创建了该组件,我就会收到以下异常:

First chance exception at $7579B9BC. Exception class EResNotFound with message 'Resource xxx not found'. Process yyy.exe (6060)

我在这里缺少什么?

编辑

包的项目中资源的调用代码如下:

Png.LoadFromResourceName(HInstance, 'png_resource_name');

编辑2

按照David的建议,我尝试使用函数GetModuleHandle,但如果我从包的项目应用程序的项目调用它,它总是返回0。在包的项目中调用的代码如下:

PackageModuleHandle := GetModuleHandle(PChar('my_package.bpl'));
Png := TPngImage.Create;
Png .LoadFromResourceName(PackageModuleHandle, 'png_resource_name');

bpl 文件的绝对路径也不起作用。

编辑3

基于新答案的新尝试:

PackageModuleHandle := FindClassHInstance(TMyComponent);
Png := TPngImage.Create;
Png .LoadFromResourceName(PackageModuleHandle, 'png_resource_name');

由于同样的异常而失败。

编辑4

使用ResourceHacker,如果我使用得当,资源似乎不在我的bpl 文件中。我可能做错了什么?对于如此简单的功能来说,似乎是一个如此复杂的问题。

结论

我必须将包的 .res 文件添加到包的 .dpr 中,紧接在 {$R *.res} 行之后。像这样:

{$R *.res}
{$R 'my_pacakge.res'}

此外,我必须将 my_package.rc 文件包含到我的项目中,这样资源就会在每次构建后编译到 .res 中。我想这确实成功了。感谢您的所有回答。

最佳答案

您需要使用FindClassHInstance()来指定组件的类类型,而不是使用全局HInstance变量或GetModuleHandle()。这样,无论包是静态链接还是动态链接到主可执行文件中,您都可以获得正确的模块句柄。

关于delphi - 如何在 Delphi 中添加和使用自定义包/组件中的资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9824396/

相关文章:

delphi - Delphi 2010-验证是否存在进程并在运行时将其杀死

delphi - 如何声明一个常量Tpoint?

delphi - 工厂模式、内存泄漏

delphi - ANTLR4 的 Delphi 语法问题

delphi - Single 数组的内存复制和内存比较数组

delphi - 使用 ZLib 单元压缩文件与使用 ZipForge 比较

delphi - 如何在 pascal 中不使用 for 循环同时设置多个数组字段?

macos - 如何在 fireMonkey Rad studio XE2 中为 Mac Osx 创建/编辑文本文件 (.rtf)?

multithreading - iTask - 将参数值传递给匿名过程

delphi - 德尔福中的 Char 和 Chr