如何在Delphi中操作自定义包或组件以添加并有效利用其中的资源?

2026-04-10 19:432阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计530个文字,预计阅读时间需要3分钟。

如何在Delphi中操作自定义包或组件以添加并有效利用其中的资源?

我想创建一个组件,用于在运行时(在其构造函数中)使用我自己的包中编译的资源(PNG图像)。我想在我的应用程序项目中使用它,但只需组件被创建,我就会得到“

我想创建一个使用我的包项目中编译的资源的组件.我的组件将尝试在运行时(在其构造函数中)使用此资源(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文件中.我能做些什么呢?这么简单的功能似乎有这么复杂的问题.

如何在Delphi中操作自定义包或组件以添加并有效利用其中的资源?

结论

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

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

此外,我必须将my_package.rc文件包含到我的项目中,因此在每次构建之后,资源将被编译到.res.我想这就是诀窍.感谢所有的答案.

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

本文共计530个文字,预计阅读时间需要3分钟。

如何在Delphi中操作自定义包或组件以添加并有效利用其中的资源?

我想创建一个组件,用于在运行时(在其构造函数中)使用我自己的包中编译的资源(PNG图像)。我想在我的应用程序项目中使用它,但只需组件被创建,我就会得到“

我想创建一个使用我的包项目中编译的资源的组件.我的组件将尝试在运行时(在其构造函数中)使用此资源(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文件中.我能做些什么呢?这么简单的功能似乎有这么复杂的问题.

如何在Delphi中操作自定义包或组件以添加并有效利用其中的资源?

结论

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

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

此外,我必须将my_package.rc文件包含到我的项目中,因此在每次构建之后,资源将被编译到.res.我想这就是诀窍.感谢所有的答案.

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