我想制作一个组件,使用在我包的项目中编译的一些资源。我的组件将在运行时(在其构造函数中)尝试使用此资源(一个PNG图像)。
我想在我的应用程序项目中使用它,但是只要组件被创建,就会出现以下异常:
绝对路径指向bpl文件也不起作用。
编辑3:
基于新的回答,进行了新的尝试:
我想在我的应用程序项目中使用它,但是只要组件被创建,就会出现以下异常:
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文件中。我可能做错了什么?这个看起来是一个简单功能,为什么变得这么复杂呢?
结论
我需要在包的.dpr文件中,在{$R *.res}行后添加包的.res文件。就像这样:
{$R *.res}
{$R 'my_pacakge.res'}
另外,我需要将my_package.rc文件包含到我的项目中,这样每次构建后资源才会编译到.res文件中。我想这样就可以解决问题了。感谢所有的回答。
.RC
文件,并指定您添加了{$R xxx}
声明的位置,谢谢。 - Warren PGetModuleHandle
在你传递正确的文件名时是有效的(你可能没有这样做)。这是 Windows 的一个非常基本的部分。它是有效的。但是,FindClassHInstance
才是正确的方法。 - David Heffernan