Delphi包资源 - EResNotFound

时间:2016-10-13 15:30:38

标签: delphi resources

已经谷歌搜索解决方案,没有任何建议对我有用,所以要么我错过了什么,要么我做错了。

我的Delphi XE2应用程序中有许多软件包,其中一些软件包包含最终为PNG图像的RCDATA资源。

使用资源的控件在Delphi XE2设计器中工作得非常好 - 资源按预期加载和绘制。当我来运行使用包/控件的主应用程序时,当控件试图加载资源项时,我出现了EResNotFound异常:

handle := FindClassHInstance(Self.ClassType);
fPlaneImage := TPngImage.Create;
fPlaneImage.LoadFromResourceName(handle, 'IDC_IMG_PLANE');

当应用程序运行时,我收到以下错误:

  

Project PinPoint.exe引发异常类EResNotFound,找不到消息IDC_IMG_PLANE'。

如果我在调试器中点击continue,我就会得到:

  

Project PinPoint.exe引发异常类EPNGCouldNotLoadResource并显示消息'无法从资源ID加载png图像。'。

我已尝试将句柄的所有变体传递到LoadFromResource函数:

fPlaneImage.LoadFromResourceName(HInstance, 'IDC_IMG_PLANE');
fPlaneImage.LoadFromResourceName(GetModuleHandle('AppCore.bpl'), 'IDC_IMG_PLANE');
fPlaneImage.LoadFromResourceName(FindClassHInstance(Self.ClassType), 'IDC_IMG_PLANE');

然而他们都产生了同样的例外。

我在考虑是否更容易创建一个包含所有资源的独立包,然后从项目中的每个其他包中引用它,而不是每个包都有自己的资源但是我是不确定这是否真的有效。

请任何人提供任何建议。

1 个答案:

答案 0 :(得分:-1)

尝试使用以下FindResModule函数获取资源模块。

// use fPlaneImage.LoadFromResourceName(FindResModule('IDC_IMG_PLANE'), 'IDC_IMG_PLANE');

function FindResModule(const AResourceName: string): HINST;
var
  LModule: PLibModule;
begin
  LModule := LibModuleList;
  while Assigned(LModule) do
  begin
    Result := LModule.Instance;
    if (Result <> 0) and (FindResource(Result, PChar(AResourceName), RT_RCDATA) <> 0) then
      Exit;

    LModule := LModule^.Next;
  end;

  Result := 0;
end;

如果它失败的情况很可能是链接器消除了资源&#34;。例如,当您创建自己的软件包并且未将包含资源的单元添加到软件包或应用程序文件时,可能会发生这种情况。只需将单元添加到应用程序的uses子句中即可。

如果您为资源创建单独的包,我认为没有坏处。它应该工作正常,但实际上并不需要。只需一个小提示,不需要BPL包,您可以将资源打包成DLL