Есть у меня такой старый исходник:
procedure TPageRes.LoadIconGroup(ANode: PResNode; IsIcon: Boolean);
function SearchNode( ID: Word; iType: Cardinal; Root: PResNode ): PResNode;
var
I: Integer;
begin
Result := nil;
if not Root.IsDirectory then
begin
if (Root.ID = ID) and (Root.DataType = iType) then
Result := Root
else
Result := nil;
Exit;
end;
for I := 0 to Root.SubDirs.Count - 1 do
begin
Result := SearchNode( ID, iType, Root.SubDirs.Items[ I ] );
if Result <> nil then
Break;
end;
end;
var
St: PStream;
GID: PGrpIconDir;
IDE: TGrpIconDirEntry;
Buf: Pointer;
I, N: Integer;
ItemNode: PResNode;
begin
St := NewReadFileStream(MainWindow.FileName);
FFrm.lstImgGroup.Clear;
GetMem( Buf, ANode.DataSize );
St.Seek( ANode.DataRaw, spBegin );
St.Read( Buf^, ANode.DataSize );
St.Free;
GID := Buf;
for I := 0 to GID.Count - 1 do
begin
IDE := GID.Entries[ I ];
if IsIcon then
N := FFrm.lstImgGroup.Add(ImageCaption(IDE.Width, IDE.Height, IDE.BitCount, IDE.ID))
else
N := FFrm.lstImgGroup.Add(ImageCaption(IDE.Width, IDE.Width, IDE.BitCount, IDE.ID));
if IsIcon then begin
ItemNode := SearchNode(IDE.ID, Cardinal(RT_ICON), ResTreeRoot);
FFrm.lstImgGroup.ItemData[N] := Cardinal(ItemNode);
end
else begin
ItemNode := SearchNode(IDE.ID, Cardinal(RT_CURSOR), ResTreeRoot);
FFrm.lstImgGroup.ItemData[N] := Cardinal(ItemNode);
end;
ItemNode.ImgX := IDE.Width;
ItemNode.ImgY := IDE.Height;
ItemNode.ImgColorDepth := IDE.BitCount;
end;
SearchMaxDepthAndSize;
FFrm.lblImgInfo.Visible := not IsIcon;
FFrm.lstImgGroupSelChange(nil);
FreeMem( Buf );
end;
Писалось всё по msdn. Работает :) Мож кто знает, писал я плагин для ТС, PEViewer называется. Было дело ковырял ресурсы, но так и не дошло это дело до релизов плагина.
Тип ResNode выглядит так:
TResNode = object( TObj )
private
...
public
constructor Create;
destructor Destroy; virtual;
property Parent: PResNode read fParent write fParent;
property IsRoot: Boolean read fIsRoot;
property IsDirectory: Boolean read fIsDirectory write fIsDirectory;
property SubDirs: PList read fSubDirs;
property DataRaw: Cardinal read fDataRaw write fDataRaw;
property DataSize: Cardinal read fDataSize write fDataSize;
property DataType: Cardinal read fDataType write fDataType;
property DisplayName: string read FDisplayName write FDisplayName;
property Name: string read fName write fName;
property Lang: Cardinal read fLang write flang;
property CodePage: Cardinal read fCodePage write fCodePage;
property ID: Word read fID write fID;
property ImgX: Integer read FImgX write FImgX;
property ImgY: Integer read FImgY write FImgY;
property ImgColorDepth: Byte read FImgColorDepth write FImgColorDepth;
end;
Объект носит информационный характер, акромя конструктора и деструктора методов нет. Пока еще не ковырялся до тех мест, где это всё задаётся значениями. ВОбщем, структуру кода выемки ресурсов из потока, думаю, поймешь. Если что не ясно спрашивай.