BorisHolub
Сообщений: 1
Оценки: 0
Присоединился: 2009-09-26 19:08:19.696666
|
Здравствуйте! Есть проблема - немогу решить, прошу помощи. Есть код на дельфи для смены иконки:
TNewHeader = record
idReserved:WORD;
idType:WORD;
idCount:WORD;
end;
TResDirHeader = packed record
bWidth:Byte;
bHeight:Byte;
bColorCount:Byte;
bReserved:Byte;
wPlanes:WORD;
wBitCount:WORD;
lBytesInRes:Longint;
end;
TIconFileResDirEntry = packed record
DirHeader:TResDirHeader;
lImageOffset:Longint;
end;
TIconResDirEntry = packed record
DirHeader:TResDirHeader;
wNameOrdinal:WORD;
end;
PIconResDirGrp = ^TIconResDirGrp;
TIconResDirGrp = packed record
idHeader:TNewHeader;
idEntries:array[0..0] of TIconResDirEntry;
end;
PIconFileResGrp = ^TIconFileResDirGrp;
TIconFileResDirGrp = packed record
idHeader:TNewHeader;
idEntries:array[0..0] of TIconFileResDirEntry;
end;
...
procedure SetAppIcon(FileName,IconFile,ResName:string);
var I,FileGrpSize,IconGrpSize:Integer; Group:Pointer; Header:TNewHeader; FileGrp:PIconFileResGrp;
IconGrp:PIconResDirGrp; Icon:TIcon; Stream:TMemoryStream; hUpdateRes:THandle;
begin
hUpdateRes:=BeginUpdateResource(PChar(FileName), True);
Icon:=TIcon.Create;
Icon.LoadFromFile(IconFile);
Stream:=TMemoryStream.Create;
try
Icon.SaveToStream(Stream);
finally
Icon.Free;
end;
Stream.Position:=0;
Stream.Read(Header, SizeOf(Header));
FileGrpSize := SizeOf(TIconFileResDirGrp) + (Header.idCount - 1) * SizeOf(TIconFileResDirEntry);
IconGrpSize := SizeOf(TIconResDirGrp) + (Header.idCount - 1) * SizeOf(TIconResDirEntry);
GetMem(FileGrp, FileGrpSize);
GetMem(IconGrp, IconGrpSize);
Stream.Position:=0;
Stream.Read(FileGrp^, FileGrpSize);
Group:=nil;
try
for I:=0 to FileGrp^.idHeader.idCount - 1 do
begin
with IconGrp^ do
begin
idHeader:=FileGrp^.idHeader;
idEntries[i].DirHeader:=FileGrp^.idEntries[i].DirHeader;
idEntries[i].wNameOrdinal:=I;
end;
with FileGrp^.idEntries[i] do
begin
Stream.Seek(lImageOffset, soFromBeginning);
ReallocMem(Group, DirHeader.lBytesInRes);
Stream.Read(Group^, DirHeader.lBytesInRes);
UpdateResource(hUpdateRes,RT_ICON,PChar(MakeIntResource(I)), 0, Group, DirHeader.lBytesInRes);
end;
end;
UpdateResource(hUpdateRes,RT_GROUP_ICON, PChar(ResName), 0, IconGrp, IconGrpSize);
EndUpdateResource(hUpdateRes, False);
finally
Stream.Free;
FreeMem(FileGrp);
FreeMem(IconGrp);
FreeMem(Group);
end;
end; Проблема вот в чем - если эти кодом менять иконку - ресурс "VersionInfo" удаляется, т.е. после смены в ЕХЕшнике остается только иконка, а все остальное - сносится. Крутил-вертел код, смотрел в МСДН про апи - все-равно не могу понять, что, где и как нужно подправить. Прошу помощи!
|