⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 upclient.~pas

📁 自动升级控件源代码
💻 ~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 + -