[英]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_ICON
和RT_ICON
。 RT_GROUP_ICON
僅包含圖標標題和目錄(分別為GRPICONDIR
和GRPICONDIRENTRY
),但是實際的圖像和遮罩分別作為RT_ICON
資源存儲。 此外,圖標文件頭和圖標組頭具有完全相同的布局和魔術值,從而使得無法檢測無效數據流。 因此,絕對不可能將TIcon.LoadFromStream
與RT_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.