function SaveIcon(Filename: String; Savename: String): Boolean;
var
lpResource, lpResource2, Buffer: PChar;
hResource: HRSRC;
ResSize, ResSize2, Written: LongWord;
hMem, h, hExe: THandle;
ID: Integer;
begin
Result := False;
bGotResource := False;
bStringRes := False;
hExe := LoadLibrary(PChar(Filename));
EnumResourceNames(hExe, RT_GROUP_ICON, @ResourceNameCallback, hInstance); // les nur die namen heraus, immer nur den ersten, wegen testen ..
if bStringRes then // wenns ein string ist, ansonsten integer
hResource := FindResource(hExe, PChar(ResourceNameStr), RT_GROUP_ICON)
else
hResource := FindResource(hExe, MAKEINTRESOURCE(ResourceName), RT_GROUP_ICON);
ResSize := sizeofResource(hExe, hResource);
hMem := LoadResource(hExe, hResource);
lpResource := LockResource(hMem);
// testen - erstes icon auslesen
// ID := LookupIconIdFromDirectoryEx(PBYTE(lpResource), True, SM_CXICON, SM_CYICON, LR_DEFAULTCOLOR);
ID := 1;
hResource := FindResource(hExe, MAKEINTRESOURCE(ID), MAKEINTRESOURCE(RT_ICON));
ResSize2 := sizeofResource(hExe, hResource);
hMem := LoadResource(hExe, hResource);
lpResource2 := LockResource(hMem);
if lpResource <> nil then
begin
h := CreateFile(PChar(Savename), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
GetMem(Buffer, 1);
// die hier hab mit nem hexeditor herausgefunden, indem ich eine datei (ico) mit reshack entpack habe und einfach eine binäre icon-datei mit der anderen icon datei verglichen habe
// patch other stuff from Group Icon
PByte(Cardinal(lpResource) + $7)^ := $40;
PByte(Cardinal(lpResource) + $12)^ := $16;
// zero offsets ( 2bytes )
PByte(Cardinal(Buffer) + $0)^ := $00;
PByte(Cardinal(Buffer) + $1)^ := $00;
// write to file
WriteFile(h, lpResource^, ResSize, Written, nil);
WriteFile(h, Buffer^, 2, Written, nil);
WriteFile(h, lpResource2^, ResSize2, Written, nil);
CloseHandle(h);
Result := True;
end;
FreeLibrary(hExe);
end;