簡體   English   中英

Delphi包資源-EResNotFound

[英]Delphi Package Resources - EResNotFound

已經通過Google搜索解決方案后,所有建議都對我無濟於事,所以我錯過了某些事情,或者做錯了什么。

我的Delphi XE2應用程序中有很多軟件包,其中幾個軟件包包含RCDATA資源,這些資源最終都是PNG圖像。

使用資源的控件在Delphi XE2設計器中絕對可以正常工作-資源按預期加載和繪制。 當我運行使用包/控件的主應用程序時,當控件嘗試加載資源項時,我會看到EResNotFound異常:

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

當應用程序運行時,出現以下錯誤:

項目PinPoint.exe引發了異常類EResNotFound,消息IDC_IMG_PLANE未找到。

如果在調試器中單擊“ continue ”,則會得到:

項目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');

然而,它們都產生相同的例外。

我正在考慮創建一個包含所有資源的獨立程序包,然后從項目中的每個其他程序包中引用它,而不是每個程序包都擁有自己的資源是否容易,但是我不確定這是否實際上會工作。

請任何人提供任何建議。

嘗試使用下面的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;

萬一發生故障,資源很可能會被鏈接器“消除”。 例如,當您創建自己的程序包而錯過將包含資源的單元添加到程序包或應用程序文件時,可能會發生這種情況。 只需將單元添加到應用程序的uses子句中即可。

如果您為資源創建一個單獨的程序包,則不會有任何危害。 它應該工作正常,但實際上不是必需的。 只是一個小提示,不需要BPL包,您可以將資源打包到DLL中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM