簡體   English   中英

從資源流加載圖標時出現奇怪的AV

[英]Strange AV while loading an icon from the resource stream

我正在通過“ 資源和圖像”對話框向項目中添加圖標,並決定不使用TIcon.LoadFromResourceName因為它不執行任何錯誤檢查。 我寫了看似等效的代碼,但沒有按預期工作。

這是一個失敗的測試用例:

procedure TForm1.FormCreate(Sender: TObject);
const
  ResName = 'Icon_1';
var
  Stream: TResourceStream;
begin
  OutputDebugString(PChar(Format('RTLVersion = %f', [RTLVersion])));
  Assert(Assigned(Image1), 'Image1 comes from the designer, should be instantiated already');

  Stream := TResourceStream.Create(HInstance, ResName, RT_GROUP_ICON);
  try
    Image1.Picture.Icon.LoadFromStream(Stream); // AV here
  finally
    Stream.Free;
  end;
end;

A / V發生在庫內部,地址為0x00000008 ,表示存在一些未初始化的對象實例。

我做錯了什么,或者是庫錯誤? 庫版本是23.0,Delphi XE2

我混淆了RT_GROUP_ICONRT_ICON RT_GROUP_ICON僅包含圖標標題和目錄(分別為GRPICONDIRGRPICONDIRENTRY ),但是實際的圖像和遮罩分別作為RT_ICON資源存儲。 此外,圖標文件頭和圖標組頭具有完全相同的布局和魔術值,從而使得無法檢測無效數據流。 因此,絕對不可能將TIcon.LoadFromStreamRT_GROUP_ICON資源一起使用,此方法僅設計用於磁盤文件。

感謝bummi為這一細微差別提供了幫助。

補充閱讀: LookupIconIdFromDirectoryEx函數參考和相應的示例代碼

我不知道是否可以使用LoadFromStream()RT_GROUP_ICON資源加載到TIcon ,但是有其他解決方案:

Image1.Picture.Icon.Handle := LoadIcon(HInstance, ResName);

要么:

Image1.Picture.Icon.Handle := LoadImage(HInstance, ResName, IMAGE_ICON, 0, 0, LR_DEFAULTSIZE);

要么:

Image1.Picture.Icon.Handle := CreateIconFromResourceEx(PByte(Stream.Memory), Stream.Size, TRUE, $00030000, 0, 0, LR_DEFAULTSIZE);

暫無
暫無

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

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