?? unit1.pas
字號:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtDlgs, ShellAPI;
type
// 首先定義儲存捆綁文件大小的信息
TFilesInfo = record
FileName: array [0..MAX_PATH] of Char;
FileSize: Longint;
end;
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
procedure UnBind; // 反捆綁
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// 選擇第一個要捆綁的文件
OpenDialog1.FileName := '';
OpenDialog1.Filter := '應用程序|*.exe';
if OpenDialog1.Execute then
Edit1.Text := OpenDialog1.FileName;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
// 選擇第二個要捆綁的文件
OpenDialog1.FileName := '';
OpenDialog1.Filter := '應用程序|*.exe';
if OpenDialog1.Execute then
Edit2.Text := OpenDialog1.FileName;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
FileName: String;
begin
SaveDialog1.Filter := '應用程序|*.exe';
if SaveDialog1.Execute then
begin
FileName := SaveDialog1.FileName;
// 檢測擴展名是否是EXE
if UpperCase(ExtractFileExt(FileName)) <> '.EXE' then
FileName := FileName + '.exe';
Edit3.Text := FileName;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
// 退出
Close;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
OutFile: TFileStream; // 輸出文件
MySelf: TFileStream; // 讀取自身文件
SourceFile: TFileStream; // 讀取被捆綁文件
SelfFileInfo, FirstFileInfo, SecondFileInfo: TFilesInfo; // 記錄被捆綁文件信息
begin
// 捆綁文件
// 初始化SelfFileInfo,FirstFileInfo,SecondFileInfo結構
FillChar(SelfFileInfo, sizeof(TFilesInfo), #0);
FillChar(FirstFileInfo, sizeof(TFilesInfo), #0);
FillChar(SecondFileInfo, sizeof(TFilesInfo), #0);
// 打開自身并讀取
MySelf := TFileStream.Create(Application.ExeName, fmOpenRead or fmShareDenyNone);
// 獲取自身文件大小
SelfFileInfo.FileSize := MySelf.Size;
SelfFileInfo.FileName := 'Bind'; // 打上標志
// 創建輸出文件
OutFile := TFileStream.Create(Edit3.Text, fmCreate or fmOpenWrite);
// 將自身文件保存在輸出文件的最前面
OutFile.CopyFrom(MySelf, 0); // 第二個參數為0時表示復制整個內容
// 關閉打開的自身文件
MySelf.Free;
// 打開第一個要捆綁的文件
SourceFile := TFileStream.Create(Edit1.Text, fmOpenRead or fmShareDenyNone);
// 獲取第一個要捆綁文件的文件名及大小
StrPCopy(FirstFileInfo.FileName, ExtractFileName(Edit1.Text));
FirstFileInfo.FileSize := SourceFile.Size;
// 將第一個文件的內容追加在輸出文件后
OutFile.CopyFrom(SourceFile, 0);
// 關閉第一個文件
SourceFile.Free;
// 打開第二個要捆綁的文件
SourceFile := TFileStream.Create(Edit2.Text, fmOpenRead or fmShareDenyNone);
// 獲取第二個要捆綁文件的文件名及大小
StrPCopy(SecondFileInfo.FileName, ExtractFileName(Edit2.Text));
SecondFileInfo.FileSize := SourceFile.Size;
// 將第二個文件的內容追加在輸出文件后
OutFile.CopyFrom(SourceFile, 0);
// 關閉第二個文件
SourceFile.Free;
// 將被捆綁文件信息寫在輸出文件未尾
OutFile.Write(SelfFileInfo, sizeof(TFilesInfo));
OutFile.Write(FirstFileInfo, sizeof(TFilesInfo));
OutFile.Write(SecondFileInfo, sizeof(TFilesInfo));
// 關閉輸出文件完成捆綁
OutFile.Free;
ShowMessage('捆綁完成!');
end;
procedure TForm1.UnBind;
var
FilesInfo: TFilesInfo;
UnBindFile: array[0..1] of TFilesInfo;
SourceFile: TFileStream; // 讀取捆綁文件
OutFile: TFileStream; // 輸出文件
begin
// 初始化
FillChar(FilesInfo, sizeof(TFilesInfo), #0);
FillChar(UnBindFile[0], sizeof(TFilesInfo), #0);
FillChar(UnBindFile[1], sizeof(TFilesInfo), #0);
SourceFile := TFileStream.Create(Application.ExeName, fmOpenRead or fmShareDenyNone);
// 移動到存儲文件信息的地方
SourceFile.Seek(SourceFile.Size - (sizeof(TFilesInfo) * 3), soFromBeginning);
// 獲取自身文件信息
SourceFile.Read(FilesInfo, sizeof(TFilesInfo));
// 如果沒有捆綁文件,則退出反捆綁過程
if FilesInfo.FileName <> 'Bind' then
begin
SourceFile.Free;
Exit;
end;
// 隱藏窗體
Application.ShowMainForm := False;
// 分別讀取第一及第二個文件的信息
SourceFile.Read(UnBindFile[0], sizeof(TFilesInfo));
SourceFile.Read(UnBindFile[1], sizeof(TFilesInfo));
// 移動到第一個文件處進行讀取文件內容
SourceFile.Seek(FilesInfo.FileSize, soFromBeginning);
// 創建第一個輸出文件
OutFile := TFileStream.Create(UnBindFile[0].FileName, fmCreate or fmOpenWrite);
OutFile.CopyFrom(SourceFile, UnBindFile[0].FileSize);
OutFile.Free;
// 運行
ShellExecute(0, 'Open', UnBindFile[0].FileName, nil, nil, SW_SHOWNORMAL);
// 創建第二個輸出文件
OutFile := TFileStream.Create(UnBindFile[1].FileName, fmCreate or fmOpenWrite);
OutFile.CopyFrom(SourceFile, UnBindFile[1].FileSize);
OutFile.Free;
// 運行
ShellExecute(0, 'Open', UnBindFile[1].FileName, nil, nil, SW_SHOWNORMAL);
// 關閉自身文件
SourceFile.Free;
// 退出
PostQuitMessage(0);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
UnBind;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -