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

📄 unit_main.pas

📁 用DELPHI编写的在线升级程序.在我实际的共享软件中已经应用.程序一模一样.直接可以用到你自己的程序中.
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit Unit_main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Gauges, Buttons,inifiles, Psock, NMHttp,shellapi,
  ImgList, ComCtrls, Registry, XMLDoc,XMLIntf, xmldom, msxmldom,
  WinSkinData;

type
  TForm_Update = class(TForm)
    Image1: TImage;
    Notebook_step: TNotebook;
    Label1: TLabel;
    ListBox_servers: TListBox;
    Gauge_process: TGauge;
    btn_next: TButton;
    HTTPFiles: TNMHTTP;
    ListView_files: TListView;
    ImageList: TImageList;
    Memo1: TMemo;
    Bevel1: TBevel;
    Label2: TLabel;
    edt_url: TEdit;
    Button1: TButton;
    lblDisplay: TLabel;
    XMLDocument: TXMLDocument;
    procedure FormCreate(Sender: TObject);
    procedure btn_nextClick(Sender: TObject);
    procedure Notebook_stepPageChanged(Sender: TObject);
    procedure ListBox_serversClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure HTTPFilesPacketRecvd(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
  private
    g_path:string;
    AppIni: TIniFile;
    ProgramList,BmpList,HttpFileList:TStrings;//分别代表程序更新列表、图片更新列表、资料根新列表
    HttpFilesNewVer:String;//资料包的更新版本
    ProgramNewVer:String;//升级包的更新版本

    function ExistNewFile:boolean;
  public
    { Public declarations }
    noConnected:Boolean;
    procedure DeleteRunProgram(FileName:string);//程序自杀
    //解析XML格式的升级信息文件
    function XMLParse(UpdateFile:String; var ProgramFileList,BmpFileList,HttpFileList:TStrings):boolean;
  end;

var
  Form_Update: TForm_Update;

implementation

{$R *.dfm}

procedure TForm_Update.FormCreate(Sender: TObject);
var
  servers:TStrings;
  i:integer;
begin
  //theMainClassName:='The Amysoft For Personal';
  noconnected:=False;
  Notebook_step.PageIndex:=0;
  ListBox_servers.Items.Clear;
  ProgramList:=TStringList.Create;
  BmpList:=TStringList.Create;
  HTTPFileList:=TStringList.Create;
  try
   g_path:=ExtractFilePath(application.ExeName);
   if copy(g_path,length(g_path),1)<>'\' then g_path:=g_path+'\';
   AppIni := TIniFile.Create(g_path+'Update.ini');
   servers:=TStringList.Create;
   AppIni.ReadSectionValues('update',servers);
   for i:=0 to servers.Count-1 do
   begin
     ListBox_servers.Items.Add(copy(servers[i],1,pos('=',servers[i])-1));
     if i=0 then edt_url.Text:=copy(servers[i],pos('=',servers[i])+1,length(servers[i]));
   end;
   if Servers.Count <=0 then
     edt_url.Text:='http://www.yanyusoft.com/SoftUpdate/Amysoft/';
 finally
   AppIni.Free;
 end;

end;

procedure TForm_Update.btn_nextClick(Sender: TObject);
var
  i:Integer;
  Flist:TListItem;
  strFile,strExtendFile:String; //文件扩展名
  VerReg:TRegistry;
  HwndHelp:Hwnd;
begin
  if btn_next.Caption='退出升级' then
  begin
    Application.Terminate;
    exit;
  end;
  if btn_next.Caption='完成升级' then
  begin
    btn_next.Enabled:=false;
    btn_next.Caption:='复制新文件..';

    //复制程序文件
    if ProgramList.Count >0 then
    begin
      for i:=0 to ProgramList.Count-1 do    //复制文件更新
      begin
        //备份一份文件出来
        //copyfile(pchar(g_path+ProgramList.Strings[i]),pchar(g_path+ProgramList.Strings[i]+'.bak'),false);
        //判断是否是EXE程序
        strExtendFile:=ExtractFileExt(g_path+ProgramList.Strings[i]);
        strExtendFile:=copy(strExtendFile,2,Length(strExtendFile)-1);
        
        if UpperCase(strExtendFile)='EXE' then
        begin
          strFile:=ChangeFileExt(g_path+ProgramList.Strings[i],'.old'); //存在旧的文件则删除
          if FileExists(strFile) then
            Deletefile(strFile);
          RenameFile(g_path+ProgramList.Strings[i],strFile);//更改执行文件名
        end
        //判断是否为system.dat文件
        else if UpperCase(strExtendFile)='DAT' then
        begin
          strFile:=ChangeFileExt(g_path+ProgramList.Strings[i],'.old'); //存在旧的文件则删除
          if FileExists(strFile) then
            Deletefile(strFile);
          RenameFile(g_path+ProgramList.Strings[i],strFile);//更改系统数据库文件名
        end
        //判断是否为.chm文件
        else if UpperCase(strExtendFile)='CHM' then
        begin
          HWndHelp := FindWindow(nil,'安利销售助手帮助');
          if HWndHelp<>0 then
            SendMessage(HWndHelp, WM_CLOSE, 0, 0);
          strFile:=ChangeFileExt(g_path+ProgramList.Strings[i],'.old'); //存在旧的文件则删除
          if FileExists(strFile) then
            Deletefile(strFile);
          RenameFile(g_path+ProgramList.Strings[i],strFile);//更改帮助文件名
        end;
      end;
      //从update复制新文件
      for i:=0 to ProgramList.Count-1 do
      begin
        if ProgramList.Strings[i]<>'System.dat' then
        begin
          CopyFile(pchar(g_path+'update\'+ProgramList.Strings[i]),pchar(g_path+ProgramList.Strings[i]),false);
          DeleteFile(pchar(g_path + 'update\' + ProgramList.Strings[i]));
        end;
      end;
    end;
    //复制资料文件
    if HttpFileList.Count >0 then
    begin
      for i:=0 to HttpFileList.Count-1 do
      begin
        CopyFile(pchar(g_path+'update\'+HttpFileList.Strings[i]),pchar(g_path+'Files\'+HttpFileList.Strings[i]),false);
        DeleteFile(pchar(g_path + 'update\' + HttpFileList.Strings[i]));
      end;
    end;
    //复制图片文件
    if BmpList.Count >0 then
    begin
      for i:=0 to BmpList.Count-1 do
      begin
        CopyFile(pchar(g_path+'update\'+BmpList.Strings[i]),pchar(g_path+'Bmps\'+BmpList.Strings[i]),false);
        DeleteFile(pchar(g_path + 'update\' + BmpList.Strings[i]));
      end;
    end;
    //删除update/AmyUpdate.xml文件
    DeleteFile(pchar(g_path + 'update\AmyUpdate.xml'));
    
    //升级成功更新信息
    Notebook_step.PageIndex:=2;
    Memo1.Lines.Add(#13#10+'感谢使用在线升级!'+#13#10);
    Memo1.Lines.add('升级成功!'+#13#10);
    Memo1.Lines.add('最新版本:主程序 V'+ProgramNewVer+',资料库 V'+HttpFilesNewVer+#13#10);
    Memo1.Lines.add('请重新打开软件!'+#13#10);
    //更改注册表,写入最新版本号
    try
      VerReg:=TRegistry.Create;
      VerReg.RootKey:=HKEY_LOCAL_MACHINE;
      VerReg.OpenKey('Software\AmySoft\Ver', true);
      VerReg.DeleteValue('ProgramVer');
      VerReg.DeleteValue('HTTPFileVer');
      VerReg.WriteString('ProgramVer',ProgramNewVer);
      VerReg.WriteString('HTTPFileVer',HTTPFilesNewVer);
    finally
      VerReg.Free;
    end;
    
    btn_Next.Visible :=false;
    exit;
  end;

  //取得升级信息
  Notebook_step.PageIndex:=Notebook_step.PageIndex+1;
  Gauge_process.MaxValue:=100;
  Gauge_process.Progress:=0;
  ListView_files.Items.Clear;
  Flist:=ListView_files.Items.Add;
  Flist.Caption:='正在获取更新列表...';
  Flist.StateIndex:=0;
  Flist.ImageIndex:=0;

  //开始下载文件
  if ExistNewFile then
  begin
    btn_next.Enabled:=false;
    btn_next.Caption:='下载中...';
    //更新程序
    if ProgramList.Count >0 then
    begin
      ListView_files.Items.Clear;
      Gauge_process.Progress:=0;
      for i:=0 to ProgramList.Count-1 do
      begin
        Flist:=ListView_files.Items.Add;
        Flist.Caption:=ProgramList.Strings[i];
        Flist.StateIndex:=-1;
        Flist.ImageIndex:=-1;
      end;
      //下载升级文件
      btn_next.Enabled:=false;
      lblDisplay.Caption:='正在下载最新程序...';
      //下载程序更新文件
      for i:=0 to ProgramList.Count-1 do
      try
        Gauge_process.MaxValue:=2000;
        Gauge_process.Progress:=1;
        ListView_files.Items[i].StateIndex:=0;
        ListView_files.Items[i].ImageIndex:=0;
        try
          HTTPFiles.InputFileMode := true;
          HTTPFiles.OutputFileMode := FALSE;
          HTTPFiles.ReportLevel := Status_Basic;
          HTTPFiles.Body:=g_path+'update/'+ProgramList.Strings[i];
          HTTPFiles.Get(Edt_url.Text+ProgramList.Strings[i]);
        except
          //下载文件失败
          ListView_files.Items[i].StateIndex:=2;
          ListView_files.Items[i].ImageIndex:=2;
        end;
        ListView_files.Items[i].StateIndex:=1;
        ListView_files.Items[i].ImageIndex:=1;
      except
      end;
    end;

    //下载图片更新文件
    if BmpList.Count >0 then
    begin
      ListView_files.Items.Clear;
      Gauge_process.Progress:=0;
      for i:=0 to BmpList.Count-1 do
      begin
        Flist:=ListView_files.Items.Add;
        Flist.Caption:=BmpList.Strings[i];
        Flist.StateIndex:=-1;
        Flist.ImageIndex:=-1;
      end;
      //下载升级文件
      lblDisplay.Caption:='正在下载最新图片...';
      //下载程序更新文件
      for i:=0 to BmpList.Count-1 do
      try
        Gauge_process.MaxValue:=2000;
        Gauge_process.Progress:=1;
        ListView_files.Items[i].StateIndex:=0;
        ListView_files.Items[i].ImageIndex:=0;
        try
          HTTPFiles.InputFileMode := true;
          HTTPFiles.OutputFileMode := FALSE;
          HTTPFiles.ReportLevel := Status_Basic;
          HTTPFiles.Body:=g_path+'update/'+BmpList.Strings[i];
          HTTPFiles.Get(Edt_url.Text+BmpList.Strings[i]);
        except
          //下载文件失败
          ListView_files.Items[i].StateIndex:=2;
          ListView_files.Items[i].ImageIndex:=2;
        end;
        ListView_files.Items[i].StateIndex:=1;
        ListView_files.Items[i].ImageIndex:=1;
      except
      end;
    end;

     //更新资料文件
    if HTTPFileList.Count >0 then
    begin
      ListView_files.Items.Clear;
      Gauge_process.Progress:=0;
      for i:=0 to HTTPFileList.Count-1 do
      begin
        Flist:=ListView_files.Items.Add;
        Flist.Caption:=HTTPFileList.Strings[i];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -