5,387
社区成员
发帖
与我相关
我的任务
分享
Unit Unit1;
Interface
Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, shellapi;
Type
TForm1 = Class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Image1: TImage;
Button2: TButton;
Edit1: TEdit;
Procedure Button1Click(Sender: TObject);
Procedure Button2Click(Sender: TObject);
Procedure FormCreate(Sender: TObject);
Procedure FormShow(Sender: TObject);
Private
Function ChangeExeIcon(ExeFile, IconFile: String; Index: Integer = 0):
Boolean; //2+
Procedure Extract_Icon;
{ Private declarations }
Public
{ Public declarations }
End;
Var
Form1: TForm1;
Icon_Index: Integer; //2+
szFileName: String;
Implementation
{$R *.dfm}
//获取系统目录
Function GetDirectory(dInt: Integer): String;
Var
s: Array[0..255] Of Char;
Begin
Case dInt Of
0: GetWindowsDirectory(@s, 256); //Windows安装文件夾所存在的路径 c:\windows\
1: GetSystemDirectory(@s, 256); //系统文件夾所存在的路径 c:\windows\system32\
2: GetTempPath(256, @s); //Temp文件夾所存在的路径 当前用户的TEMP目标不带\
End;
If dInt = 2 Then
result := String(s)
Else
result := String(s) + '\';
End;
////////////////////////////////////////////////////////////
Procedure TForm1.FormCreate(Sender: TObject);
Begin
szFileName := pchar(GetDirectory(2) + '789.ico');
//szFileNameTEMP目录中的789图标
End;
////////////////////////////////////////////////////////////
Procedure TForm1.Extract_Icon;
Var
icon_handle: Longint;
buffer: Array[0..1024] Of Char;
Begin
If Not (FileExists(Edit1.Text)) Then
Exit; //判断文件是否存在
StrPCopy(buffer, Edit1.Text);
icon_handle := ExtractIcon(self.Handle, buffer, Icon_Index);
If icon_handle = 0 Then
Begin
If Icon_Index = 0 Then
Begin
Application.MessageBox('这个文件没有发现图标,请重新选择!', '信息',
MB_ICONINFORMATION + MB_OK);
Image1.Visible := False;
End
Else
Icon_Index := Icon_Index - 1;
Exit;
End;
Image1.Picture.Icon.Handle := icon_handle;
Image1.Visible := True;
End;
//API函数ExtractIcon来取出EXE里面的图标.下面是修改图标的函数
Function TForm1.ChangeExeIcon(ExeFile, IconFile: String; Index: Integer = 0):
Boolean;
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
MessageBox(Handle, 'EXE中没有找到该序列的图标!', '提示', 64);
Exit;
End;
ExeIcon.Handle := IconHandle;
ExeIconStrings := TStringStream.Create('');
ExeIcon.SaveToStream(ExeIconStrings);
ExeIcon.Free;
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;
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
MessageBox(Handle, 'EXE中没有找到该序列的图标!', '提示', 64);
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
End;
End;
Procedure TForm1.Button1Click(Sender: TObject);
Var
ExeFile: String;
Begin
ExeFile := paramstr(1);
If Not (ExeFile = '') Then
Begin
If ChangeExeIcon(ExeFile, szFileName) Then
Begin
MessageBox(Handle, '更换图标成功!', '提示', 64);
End
Else
MessageBox(Handle, '更换图标失败!', '提示', 64);
End;
Close;
End;
Procedure TForm1.Button2Click(Sender: TObject);
Begin
OpenDialog1.Filter :=
'所有支持类型(*.EXE,*.DLL,*.OCX,*.ICL,*.ICO,*.BMP)|*.exe;*.dll;*.ocx;*.icl;*.ico;*.bmp|所有文件(*.*)|*.*';
If OpenDialog1.Execute Then
Begin
Edit1.Text := OpenDialog1.Filename;
Icon_Index := 0;
Extract_Icon;
End;
Image1.Picture.Icon.SaveToFile(szFileName); //保存图标
End;
Procedure TForm1.FormShow(Sender: TObject);
Var
ExeFile: String;
Begin
ExeFile := paramstr(1); //判断是否有参数
If ExeFile = '' Then
Begin
Close;
End;
End;
End.