为什么下面二段改ICON的代码都改不了。
我只是想把一个*.ICO写到一个EXE程序里面去,但为什么每次写的时候都写不进去。请教解答。谢谢!var
Handle: THandle;
P: Pointer;
FileStrSize: Integer;
FileStr, FS: TFileStream;
begin
FileStr := TFileStream.Create(PChar(Edit1.Text), fmOpenRead);
FileStrSize := FileStr.Size;
GetMem(P, FileStrSize);
FileStr.Read(P^, FileStrSize); Handle := BeginUpdateResource(PChar(Edit2.Text), false);
UpdateResource(Handle, RT_GROUP_ICON, 'MAINICON', LANG_SPANISH , p, FileStrSize);
EndUpdateResource(Handle, false);
FreeMem(P, FileStrSize);
FileStr.Free;
end;
var
Ico: TIcon;
Stream : TMemoryStream;
hInst: THandle;
ptr : Pointer;
begin
Ico:=TIcon.Create;
Ico.LoadFromFile(Edit1.Text); Stream := TMemoryStream.Create;
Ico.SaveToStream(Stream);
Ico.Free;
getmem(ptr, Stream.size + 1); //函数是用来在堆中分配指定数量的内存的
try
Stream.Seek(soFromBeginning, 0);
Stream.read(ptr^, Stream.size);
hInst := BeginUpdateResource(Pchar(Edit2.Text), False);
if hInst > 0 then
begin
UpdateResource(hInst, RT_GROUP_ICON, 'MAINICON', 1031, ptr, Stream.size);
EndUpdateResource(hInst, False);
end;
finally
freemem (ptr, Stream.size + 1);
stream.Free;
end;
end;
我只是想把一个*.ICO写到一个EXE程序里面去,但为什么每次写的时候都写不进去。请教解答。谢谢!var
Handle: THandle;
P: Pointer;
FileStrSize: Integer;
FileStr, FS: TFileStream;
begin
FileStr := TFileStream.Create(PChar(Edit1.Text), fmOpenRead);
FileStrSize := FileStr.Size;
GetMem(P, FileStrSize);
FileStr.Read(P^, FileStrSize); Handle := BeginUpdateResource(PChar(Edit2.Text), false);
UpdateResource(Handle, RT_GROUP_ICON, 'MAINICON', LANG_SPANISH , p, FileStrSize);
EndUpdateResource(Handle, false);
FreeMem(P, FileStrSize);
FileStr.Free;
end;
var
Ico: TIcon;
Stream : TMemoryStream;
hInst: THandle;
ptr : Pointer;
begin
Ico:=TIcon.Create;
Ico.LoadFromFile(Edit1.Text); Stream := TMemoryStream.Create;
Ico.SaveToStream(Stream);
Ico.Free;
getmem(ptr, Stream.size + 1); //函数是用来在堆中分配指定数量的内存的
try
Stream.Seek(soFromBeginning, 0);
Stream.read(ptr^, Stream.size);
hInst := BeginUpdateResource(Pchar(Edit2.Text), False);
if hInst > 0 then
begin
UpdateResource(hInst, RT_GROUP_ICON, 'MAINICON', 1031, ptr, Stream.size);
EndUpdateResource(hInst, False);
end;
finally
freemem (ptr, Stream.size + 1);
stream.Free;
end;
end;
好像Application.Icon.LoadFromFile('D:\1.ico');
一句话就可以更换图标
Icon: TIcon;
Handle: THandle;
MemStream: TMemoryStream;
begin
Icon := TIcon.Create;
Icon.LoadFromFile(Edit1.Text);
MemStream := TMemoryStream.Create;
Icon.SaveToStream(MemStream);
Icon.Free; Handle := BeginUpdateResource(Pchar(Edit2.Text), True);
UpdateResource(Handle, RT_ICON, MAKEINTRESOURCE(RT_ICON), 0, @Icon, MemStream.Size);
EndUpdateResource(Handle, False);
FreeResource(Handle);
end;
var
TempStream,NewIconMemoryStream:TMemoryStream;
OldIconStrings,ExeStrings,ExeIconStrings:TStringStream;
ExeIcon:TIcon;
IconPosition,IconLength,IconHeadLength:Integer;
IconHandle:HICON;
ExeFileStream,IconFileStream:TFileStream;
begin
Result:=False;
IconHeadLength:=126;
if (not FileExists(ExeFile)) or (not FileExists(IconFile)) then Exit;
try
ExeFileStream:=TFileStream.Create(ExeFile,fmOpenReadWrite+fmShareDenyWrite);
ExeStrings:=TStringStream.Create('');
ExeStrings.Position:=0;
ExeFileStream.Position:=0;
ExeStrings.CopyFrom(ExeFileStream,0);
ExeIcon:=TIcon.Create;
IconHandle:=ExtractIcon(Application.Handle,Pchar(ExeFile),Index);
if IconHandle<=1 then
begin
Application.MessageBox('EXE中没有找到该序列的图标!',Pchar(Application.Title),MB_ICONERROR+MB_OK);
Exit;
end;
ExeIcon.Handle:=IconHandle;
ExeIconStrings:=TStringStream.Create('');
ExeIcon.SaveToStream(ExeIconStrings);
ExeIcon.Free;
ExeIcon:=nil;
IconLength:=ExeIconStrings.Size-IconHeadLength;
ExeIconStrings.Position:=IconHeadLength;
OldIconStrings:=TStringStream.Create('');
OldIconStrings.Position:=0;
ExeIconStrings.Position:=IconHeadLength;
OldIconStrings.CopyFrom(ExeIconStrings,IconLength);
ExeIconStrings.Free;
IconPosition:=Pos(OldIconStrings.DataString,ExeStrings.DataString);
ExeStrings.Free;
ExeStrings:=nil;
OldIconStrings.Free;
IconFileStream:=TFileStream.Create(IconFile,fmOpenRead+fmShareDenyNone);
NewIconMemoryStream:=TMemoryStream.Create;
IconFileStream.Position:=IconHeadLength;
NewIconMemoryStream.Position:=0;
NewIconMemoryStream.CopyFrom(IconFileStream,IconFileStream.Size-IconHeadLength);
IconFileStream.Free;
if IconPosition<=0 then
begin
Application.MessageBox('EXE中没有找到该图标的数据!',Pchar(Application.Title),MB_ICONERROR+MB_OK);
Exit;
end; if IconLength<>NewIconMemoryStream.Size then
begin
TempStream:=TMemoryStream.Create;
ExeFileStream.Position:=IconPosition+IconLength-1;
TempStream.Position:=0;
TempStream.CopyFrom(ExeFileStream,ExeFileStream.Size-ExeFileStream.Position);
ExeFileStream.Position:=IconPosition-1;
NewIconMemoryStream.Position:=0;
ExeFileStream.CopyFrom(NewIconMemoryStream,0);
TempStream.Position:=0;
ExeFileStream.CopyFrom(TempStream,0);
ExeFileStream.Position:=0;
ExeFileStream.Size:=IconPosition+IconLength-1+TempStream.Size;
TempStream.Free;
end else
begin
ExeFileStream.Position:=IconPosition-1;
NewIconMemoryStream.Position:=0;
ExeFileStream.CopyFrom(NewIconMemoryStream,0);
end;
NewIconMemoryStream.Free;
Result:=True;
finally
ExeFileStream.Free;
end;
end;
http://www.delphibox.com/
或
http://www.delphifans.com/