unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ComCtrls;
type
TPackage = packed record {定义结构 TPackage}
startFlag: char;
totalSize: Integer;
paramCnt: Integer;
param1Len: Integer;
param2Len: Integer;
param3Len: Integer;
param1: array[0..254] of byte;
param2: array[0..254] of byte;
param3: array[0..254] of byte;
endFlag: Char;
end;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Edit1: TEdit;
GroupBox2: TGroupBox;
Memo1: TMemo;
btn_read: TBitBtn;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
edt_param1: TEdit;
Label4: TLabel;
Label5: TLabel;
edt_param2: TEdit;
edt_param3: TEdit;
btn_write: TBitBtn;
StatusBar1: TStatusBar;
Button1: TButton;
procedure btn_writeClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure btn_readClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
TempName: string;
data: TPackage;
implementation
{$R *.dfm}
procedure TForm1.btn_writeClick(Sender: TObject);
var
param1, param2, param3: string;
paramCnt, len_param1, len_param2, len_param3: integer;
i: integer;
Stream1: TMemoryStream;
begin
paramCnt := strtoint(Trim(Edit2.Text));
param1 := edt_param1.Text;
param2 := edt_param2.Text;
param3 := edt_param3.Text;
len_param1 := Length(param1);
len_param2 := Length(param2);
len_param3 := Length(param3);
data.startFlag := '#';
data.paramCnt := paramCnt;
data.param1Len := len_param1;
data.param2Len := len_param2;
data.param3Len := len_param3;
for i := 0 to Length(param1) do
begin
data.param1[i] := byte(param1[i]) ;
end;
for i := 0 to Length(param2) do
begin
data.param2[i] := byte(param2[i]);
end;
for i := 0 to Length(param3) do
begin
data.param3[i] := byte(param3[i]);
end;
data.endFlag := '#';
data.totalSize := SizeOf(data);
Memo1.Clear;
Memo1.Lines.Add('包大小:' + IntToStr(SizeOf(data)) + '字节');
Stream1 := TMemoryStream.Create;
Stream1.LoadFromFile(ParamStr(0));
Memo1.Lines.Add('当前EXE文件:' + ParamStr(0) + ',大小:' + IntToStr(Stream1.Size) + '字节');
Stream1.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Sr: TSearchRec;
size : Longint;
begin
FindFirst(ParamStr(0),$27,Sr);
size:=Sr.Size;
FindClose(Sr);
StatusBar1.SimpleText:='本程序大小为 '+IntToStr(size)+' 字节';
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowMessage(TempName+' '+ParamStr(0));
WinExec(PChar(TempName+' '+ParamStr(0)), SW_SHOWNORMAL);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Dir: PChar;
Ch: Array[0..3] of Char;
Stream1,Stream2: TMemoryStream;
param1, param2, param3: string;
i:integer ;
begin
GetMem(Dir,254);
GetTempPath(254, Dir);
//TempName:=StrPas(Dir)+'o.o.0.o.o.exe';
TempName:=ExtractFilePath(ParamStr(0))+'测试o.o.0.o.o.exe';
CopyFile(PChar(ParamStr(0)),PChar(TempName),False);
Stream1:=TMemoryStream.Create;
Stream2:=TMemoryStream.Create;
Stream1.LoadFromFile(TempName);
//在尾部加入 字节
Stream1.Seek(0,soFromEnd);
Stream1.Write(data.startFlag,SizeOf(data.startFlag));
Stream1.Write(data.totalSize,SizeOf(data.totalSize));
Stream1.Write(data.paramCnt,SizeOf(data.paramCnt));
Stream1.Write(data.param1Len,SizeOf(data.param1Len));
Stream1.Write(data.param2Len,SizeOf(data.param2Len));
Stream1.Write(data.param3Len,SizeOf(data.param3Len));
Stream1.Write(data.param1,SizeOf(data.param1));
Stream1.Write(data.param2,SizeOf(data.param2));
Stream1.Write(data.param3,SizeOf(data.param3));
Stream1.Write(data.endFlag,SizeOf(data.endFlag));
for i := 0 to Length(data.param1) do
begin
param1 := param1+ char(data.param1[i]);
end;
for i := 0 to Length(data.param2) do
begin
param2 := param2+ char(data.param2[i]);
end;
for i := 0 to Length(data.param3) do
begin
param3 := param3+ char(data.param3[i]);
end;
Memo1.Lines.Add('data.startFlag:'+data.startFlag);
Memo1.Lines.Add('data.totalSize:'+inttostr(data.totalSize));
Memo1.Lines.Add('data.paramCnt:'+inttostr(data.paramCnt));
Memo1.Lines.Add('data.param1Len:'+inttostr(data.param1Len));
Memo1.Lines.Add('data.param2Len:'+inttostr(data.param2Len));
Memo1.Lines.Add('data.param3Len:'+inttostr(data.param3Len));
Memo1.Lines.Add('data.param1:'+trim(param1));
Memo1.Lines.Add('data.param2:'+trim(param2));
Memo1.Lines.Add('data.param3:'+trim(param3));
Memo1.Lines.Add('data.endFlag:'+data.endFlag);
ShowMessage(Memo1.Text);
//修改偏移48的一个字节,记录程序运行次数
Stream1.Seek(0,soFromBeginning);
Stream2.CopyFrom(Stream1,Stream1.Size);
//Stream2.CopyFrom(Stream1,48);
//Stream1.Seek(48,soFromBeginning);
//Stream1.Read(Ch,1);
// Ch[0]:=Chr(1+Ord(Ch[0]));
// Stream2.Write(Ch,1);
// Stream1.Seek(49,soFromBeginning);
// Stream2.CopyFrom(Stream1,Stream1.Size-49);
Stream2.SaveToFile(TempName);
Stream1.Free;
Stream2.Free;
FreeMem(Dir);
repeat Close Until FileExists(TempName);
end;
procedure TForm1.btn_readClick(Sender: TObject);
var
Stream1: TMemoryStream;
param1, param2, param3: string;
i:integer;
begin
Stream1:=TMemoryStream.Create;
Stream1.LoadFromFile(ParamStr(0));
//在尾部加入 字节
Stream1.Seek(-SizeOf(data),soFromEnd);
Stream1.Read(data.startFlag,SizeOf(data.startFlag));
Stream1.Read(data.totalSize,SizeOf(data.totalSize));
Stream1.Read(data.paramCnt,SizeOf(data.paramCnt));
Stream1.Read(data.param1Len,SizeOf(data.param1Len));
Stream1.Read(data.param2Len,SizeOf(data.param2Len));
Stream1.Read(data.param3Len,SizeOf(data.param3Len));
Stream1.Read(data.param1,SizeOf(data.param1));
Stream1.Read(data.param2,SizeOf(data.param2));
Stream1.Read(data.param3,SizeOf(data.param3));
Stream1.Read(data.endFlag,SizeOf(data.endFlag));
if(data.startFlag <> '#' ) or (data.endFlag <> '#' ) then
begin
ShowMessage('文件还未配置,请先写入 配置');
Stream1.Free;
Exit;
end;
for i := 0 to Length(data.param1) do
begin
param1 := param1+ char(data.param1[i]);
end;
for i := 0 to Length(data.param2) do
begin
param2 := param2+ char(data.param2[i]);
end;
for i := 0 to Length(data.param3) do
begin
param3 := param3+ char(data.param3[i]);
end;
Memo1.Lines.Add('data.startFlag:'+data.startFlag);
Memo1.Lines.Add('data.totalSize:'+inttostr(data.totalSize));
Memo1.Lines.Add('data.paramCnt:'+inttostr(data.paramCnt));
Memo1.Lines.Add('data.param1Len:'+inttostr(data.param1Len));
Memo1.Lines.Add('data.param2Len:'+inttostr(data.param2Len));
Memo1.Lines.Add('data.param3Len:'+inttostr(data.param3Len));
Memo1.Lines.Add('data.param1:'+trim(param1));
Memo1.Lines.Add('data.param2:'+trim(param2));
Memo1.Lines.Add('data.param3:'+trim(param3));
Memo1.Lines.Add('data.endFlag:'+data.endFlag);
Stream1.Free;
end;
end.