📄 upclient.~pas
字号:
unit UpClient;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ScktComp,WinSock,Registry,IniFiles,StrUtils,
Buttons;
Const
MP_QUERY ='11111';
MP_REFUSE ='22222';
MP_ACCEPT ='33333';
MP_NEXTWILLBEDATA='44444';
MP_DATA ='55555';
MP_ABORT ='66666';
MP_OVER ='77777';
MP_CHAT ='88888';
MP_END='99999';
MP_FILEPROPERTY='00000';
type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Label2: TLabel;
Label4: TLabel;
Label5: TLabel;
Panel2: TPanel;
Label7: TLabel;
Label8: TLabel;
SS1: TServerSocket;
CS1: TClientSocket;
Timer1: TTimer;
SpeedButton1: TSpeedButton;
Timer2: TTimer;
Label3: TLabel;
Label6: TLabel;
Timer3: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure CS1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure SS1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Panel2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure SpeedButton1Click(Sender: TObject);
procedure CS1Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Timer2Timer(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
private
fsRecv:TFileStream;
bStart:Boolean;
TickCount:Longword;
{ Private declarations }
public
Procedure RINI(Sender: TObject); //读取ini文件;
Procedure Wini(S:STRING);
Function ConnectTo(S:string):boolean;
Procedure FileOver(Sender:TOBject);
end;
var
Form1: TForm1;
CurrentDir,
UpServerIP,
SoftName,//要更新程序的软件名称;
CurrentVer, //此时程序的版本;
ExePath,//老程序的路径和程序名字;
NewVer
:String;
SH:Integer;
implementation
{$R *.dfm}
Procedure Tform1.FileOver(Sender:TOBject);
begin
Label7.Caption:='软件更新完毕!';
Label7.Font.Color:=clBlue;
Label7.Refresh;
Label8.Caption:='';
Label8.Font.Color:=clBlue;
label8.Refresh;
SH:=4;
if not Fileexists(exepath) then
begin
Messagedlg('更新失败,请确认UPdate.ini文件中的软件路径的正确性!',mterror,[mbok],0);
close;
exit;
end;
deletefile(Exepath);
if not RenameFile(CurrentDir+'\temp.exe',Exepath) then
begin
Messagedlg('更新失败,请确认临时文件TEMP.EXE是否存在!',mterror,[mbok],0);
close;
exit;
end;
timer3.Enabled:=true;
end;
//-------------------------------------
Procedure Tform1.Wini(S:STRING);
var T:tinifile;
BEGIN
T:=tinifile.Create(CurrentDir+'\Update.ini');
T.WriteString('SoftInfo','CurrentVer',s);
T.WriteString('SoftInfo','UDDate',datetimetostr(now));
t.Free;
END;
Function Tform1.ConnectTo(S:string):boolean;
begin
try
cs1.Active:=false;
CS1.Address:=S;
CS1.Port:=7000;
cs1.Active:=true;
// cs2.Active:=false;
// cs2.Address:=s;
// cs2.Port:=8000;
// cs2.Active:=true;
except
Messagedlg('此用户没有启动播放器,或者局域网络有故障!',mterror,[mbok],0);
result:=false;
end;
result:=true;
end;
//------------------------------------------
Procedure Tform1.RINI(Sender: TObject); //读取ini文件;
var T:tinifile;
begin
T:=tinifile.Create(CurrentDir+'\Update.ini');
UpServerIP:=T.ReadString('SoftInfo','UpServerIP','Error');
SoftName:=T.ReadString('SoftInfo','Name','Error');
CurrentVer:=T.ReadString('SoftInfo','CurrentVer','Error');
ExePath:=T.ReadString('SoftInfo','ExePath','Error');
t.Free;
end;
function LocalIP:string;
type
TaPInAddr = Array[0..10]of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe:PHostEnt;
pptr:PaPInAddr;
Buffer:Array[0..63]of char;
I:Integer;
GInitData:TWSADATA;
begin
WSAStartUp($101,GInitData);
Result:='';
GetHostName(Buffer,SizeOf(Buffer));
phe:=GetHostByName(Buffer);
if phe = nil then Exit;
pptr:=PaPInAddr(phe^.h_addr_list);
I:=0;
While pptr^[I]<> nil do begin
Result:=StrPas(inet_ntoa(pptr^[I]^));
Inc(I);
end;
WSACleanUp;
end;
//-----------------------------------------------------
procedure TForm1.Timer1Timer(Sender: TObject);
begin
IF SH=1 then
begin
Label2.Caption:=Label2.caption+'>';
if strlen(pchar(label2.caption))>=40 then
Label2.caption:='';
end
else if SH=2 THEN
begin
Label6.Caption:=Label6.caption+'>' ;
if strlen(pchar(label6.caption))>=40 then
Label6.caption:='';
end
else IF SH=3 THEN
begin
Label7.Caption:=Label7.caption+'>' ;
if strlen(pchar(label7.caption))>=40 then
Label7.caption:='';
end
else
begin
Label8.Caption:=Label8.caption+'>';
if strlen(pchar(label8.caption))>=40 then
Label8.caption:='';
end;
end;
procedure TForm1.FormShow(Sender: TObject);
var ExeHandle:Thandle;
S:string;
begin
rini(self);
//关闭启动的要升级程序;
//-----------------------------
s:=ExtractFileName(Exepath);
ExeHandle:=FindWindow(nil,pchar(leftstr(s,strlen(pchar(s))-4)));
if ExeHandle<>0 then
SendMessage(ExeHandle,WM_Close,0,0);
//----------------------------
panel2.Caption:=' ※'+SoftName+'※ 升级更新系统<客户端>';
timer1.Enabled:=true;
Label2.Caption:='';
SH:=1;
ConnectTo(UpServerIP);
timer2.Enabled:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CurrentDir:=GetCurrentdir();
end;
procedure TForm1.CS1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
timer1.Enabled:=false;
Messagedlg('升级服务器程序没有启动,升级程序将要退出!',mterror,[mbok],0);
close;
end;
procedure TForm1.SS1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
sTemp,sFileName:string;
bufRecv:Pointer;
iLength:Integer;
begin
iLength:=Socket.ReceiveLength;
GetMem(bufRecv,iLength);
try
Socket.ReceiveBuf(bufRecv^,iLength); //
sTemp:=StrPas(PChar(bufRecv));
sTemp:=Copy(sTemp,1,5);
if sTemp=MP_QUERY then
begin
fsRecv:=TFileStream.Create(CurrentDir+'\temp.exe',fmCreate);
//如果愿意接收数据。
TickCount:=GetTickCount;
Socket.SendText(MP_ACCEPT);
//通知发送端发送数据。
bStart:=False;
end else if sTemp=MP_FILEPROPERTY then
begin
//要发送StrToInt(Copy(sTemp,2,Length(sTemp))) 次
//时间进度显示。。。
//iRecvLength:=StrToInt(Copy(sTemp,2,Length(sTemp)));//;1024
Socket.SendText(MP_NEXTWILLBEDATA);
//接收文件长度并要求继续传送数据。
end else if sTemp=MP_NEXTWILLBEDATA then
begin
Socket.SendText(MP_DATA);
//要求发送端发送数据。
//准备好接收数据。
end else if sTemp=MP_OVER then
begin
timer1.Enabled:=false;
fsRecv.Free;
end else if sTemp=MP_END then//文件传送结束。
begin
fsRecv.Free;
cs1.Active:=false;
Wini(NewVer);//将刚得到的最新版本写入ini文件;
FileOver(self);
end else
begin
fsRecv.WriteBuffer(bufRecv^,iLength);//
Socket.SendText(MP_NEXTWILLBEDATA);
end;
finally
FreeMem(bufRecv,iLength);
end;
end;
procedure TForm1.Panel2MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if (ssleft in Shift) then
begin
ReleaseCapture;
Perform(WM_syscommand, $F012, 0);
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.CS1Read(Sender: TObject; Socket: TCustomWinSocket);
var stemp:string;
begin
stemp:=socket.ReceiveText;
if stemp='11000' then
begin
label2.Caption:='服务器连接成功!';
timer2.enabled:=false;
label6.Caption:='';
label6.Font.Color:= clBlue;
SH:=2;
label6.Refresh;
socket.SendText('11100'+CurrentVer);//检测版本信息...
end;
if stemp='11110' then
begin
Messagedlg('对不起,您现在的软件版本已经是最新的版本,无需下载更新,程序将要退出!',mtwarning,[mbok],0);
close;
exit;
end;
if leftstr(stemp,5)='20002' then //对方开始发送文件...
begin
label6.caption:='更新信息检测成功!';
label6.font.color:=clBlue;
label6.refresh;
label7.caption:='';
label7.font.color:=clBlue;
Sh:=3;
label7.refresh;
NewVer:=Copy(stemp,6,strlen(pchar(stemp)) );
socket.SendText('30003');//准备接收
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
cs1.Socket.SendText('10001'+Localip);
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
if WinExec(pchar(exepath),SW_SHOWNORMAL)<31 then
begin
MessageDlg('无法定位'+exepath+'程序,请手动运行!',mtWarning,[mbYes],0);
Exit;
end;
timer3.Enabled:=false;
form1.Close;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -