我想做个能自动更新文件的软件,但是现在思路不清晰,请高手帮忙。
功能:根据网站上的INI文件(例如:www.gzdc.net/files.ini)和本机的INI文件进行对比,把不同的内容所有关键字显示在例如TREEVIEW或者LISTBOX之类的控件里面。双击某一节点触发以关键字的值为路径的文件
(例如值为:www.gzdc.net/111/1.exe)。
INI文件内容:
[文件名]
金山快译=www.gzdc.net/jsky/jsky.exe双击后能打开金山快译这个安装包,然后进行安装。

解决方案 »

  1.   

    严重关注!!!!我只知道做自动更新程序需要在访问页面的WEB代码进行一定的设置!!!!网络上好象有专门介绍这个功能的文章啊,楼主找找吧!!!!帮你顶!!!!
      

  2.   

    其实也不复杂,就是把我要更新的内容显示出来,然后双击就开始下载,但是下载最好是后台运行,不可见的,下载完后会自动运行EXE文件。
    就像用IE下载软件用打开,不是另存为的那种效果。
      

  3.   

    unit UFm_Update;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons, ComCtrls,DB, DBTables, DBCtrls,Registry,ShellAPI;type
      TFm_Update = class(TForm)
        GB_Server: TGroupBox;
        Lab_Name1: TLabel;
        Lab_Name3: TLabel;
        GB_Local: TGroupBox;
        Lab_Version1: TLabel;
        Lab_Version3: TLabel;
        Lab_Size1: TLabel;
        Lab_Size3: TLabel;
        Lab_Date1: TLabel;
        Lab_Date3: TLabel;
        Btn_Down: TBitBtn;
        Btn_Exit: TBitBtn;
        Lab_Name2: TLabel;
        Lab_Name4: TLabel;
        Lab_Version2: TLabel;
        Lab_Version4: TLabel;
        Lab_Size2: TLabel;
        Lab_Size4: TLabel;
        Lab_Date2: TLabel;
        Lab_Date4: TLabel;
        Btn_Up: TBitBtn;
        Ani_UpDown: TAnimate;
        Btn_Select: TBitBtn;
        OD_UpFile: TOpenDialog;
        Lab_UpdateTime: TLabel;
        Lab_UpdateTime1: TLabel;
        DB_Update: TDatabase;
        Tab_Update: TTable;
        FPrgame: TStringField;
        FFT: TBlobField;
        Tab_UpdateCsName: TStringField;
        QComm: TQuery;
        procedure FormShow(Sender: TObject);
        procedure Btn_ExitClick(Sender: TObject);
        procedure Btn_UpClick(Sender: TObject);
        procedure Btn_SelectClick(Sender: TObject);
        procedure Btn_DownClick(Sender: TObject);
      private
        { Private declarations }
        TempPath:String;
        procedure GetVerInfo();
        function GetRar:Boolean;
      public
        LocalFile,FileOrgName:String;
        Function CompareVersion(VerLocal,VerServer:String):Boolean;
        { Public declarations }
      end;var
      Fm_Update: TFm_Update;implementationuses UPublic;{$R *.DFM}
    procedure TFm_Update.GetVerInfo;
    var VerInfo:TFileVersionInfo;
        dwSizeLow:DWORD;
        FF:Integer;
    begin
      FF:=FileOpen(LocalFile,fmShareDenyNone);
      dwSizeLow := GetFileSize (FF, nil) ;
      if dwSizeLow = $FFFFFFFF then
        Lab_Size4.Caption:='0'
      else
        Lab_Size4.Caption:=IntToStr(dwSizeLow);  Lab_Name4.Caption:='';
      Lab_Version4.Caption:='';
      Lab_Date4.Caption:='';
      FileClose(FF);
      GetFileVerInfo(PChar(LocalFile),VerInfo);
      FileOrgName:=VerInfo.OriginalFilename;
      if (UpperCase(Trim(FileOrgName))<>UpperCase('dhk.exe'))
         and (UpperCase(Trim(FileOrgName))<>UpperCase('FDUpdate.exe')) then
        if Pos('winrar.exe',LowerCase(LocalFile))=0 then begin
          MessageBox(self.Handle,'要分发的软件信息错误,请重新选择!','错误',MB_ICONERROR);
          Exit;
        end;
      Lab_Name4.Caption:=VerInfo.FileDescription;
      Lab_Version4.Caption:=VerInfo .FileVersion;// .fix .FileVersion;
      Lab_Date4.Caption:=DateTimeToStr(FileTimeGet(LocalFile,3));
      With QComm do begin
        Close;
        SQL.Clear;
        SQL.Add('select ProgramName,CsName,Version,FileSize,FileDate,UpdateTime '+
                ' from GY_FileUpdate where ProgramName=:FileName ');
        ParamByName('FileName').AsString:=Trim(FileOrgName);
        Open;
        Last;
        First;
        if IsEmpty or (RecordCount<>1) then begin
          Lab_Name3.Caption:='未知';
          Lab_Version3.Caption:='未知';
          Lab_Size3.Caption:='未知';
          Lab_Date3.Caption:='未知';
          Lab_UpdateTime1.Caption:='未知';
        end else begin
          Lab_Name3.Caption:=FieldByName('CsName').AsString;
          Lab_Version3.Caption:=FieldByName('Version').AsString;
          Lab_Size3.Caption:=FieldByName('FileSize').AsString;
          Lab_Date3.Caption:=FieldByName('FileDate').AsString;
          Lab_UpdateTime1.Caption:=FieldByName('UpdateTime').AsString;
        end;
      end;
    end;
      

  4.   

    Function TFm_Update.CompareVersion(VerLocal,VerServer:String):Boolean;
    var sTemp1:String;
        Ver:array[0..1,0..3] of Integer;
        i,j:Integer;
    begin
      if (Trim(VerLocal)='未知') or (Trim(VerServer)='未知') then begin
        Result:=False;
        Exit;
      end;
      Ver[0,0]:=0;         Ver[0,1]:=0;
      Ver[0,2]:=0;         Ver[0,3]:=0;
      Ver[1,0]:=0;         Ver[1,1]:=0;
      Ver[1,2]:=0;         Ver[1,3]:=0;
      sTemp1:='';
      j:=0;
      for i:=1 to Length(VerLocal) do begin
        if (Copy(VerLocal,i,1)<>'.')  and (i<>Length(VerLocal)) then
          sTemp1:=sTemp1+Copy(VerLocal,i,1)
        else begin
          if i=Length(VerLocal) then
            sTemp1:=sTemp1+Copy(VerLocal,i,1);
          Try
            StrToInt(sTemp1);
          Except
            sTemp1:='0';
          End;
          Ver[0,j]:=StrToInt(sTemp1);
          sTemp1:='';
          j:=j+1;
        end;
      end;
    {  if Trim(sTemp1)<>'' then begin
        Try
          StrToInt(sTemp1);
        Except
          sTemp1:='0';
        End;
        Ver[0,j]:=StrToInt(sTemp1);
      end;}
      j:=0;
      sTemp1:='';
      for i:=1 to Length(VerServer) do begin
        if (Copy(VerServer,i,1)<>'.')  and (i<>Length(VerServer)) then
          sTemp1:=sTemp1+Copy(VerServer,i,1)
        else begin
          if i=Length(VerServer) then
            sTemp1:=sTemp1+Copy(VerServer,i,1);
          Try
            StrToInt(sTemp1);
          Except
            sTemp1:='0';
          End;
          Ver[1,j]:=StrToInt(sTemp1);
          sTemp1:='';
          j:=j+1;
        end;
      end;
      Result:=False;
      for i:=0 to 3 do begin
        //Local < Server
        if Ver[0,i]<Ver[1,i] then begin
          Result:=True;//服务器文件比本地新
          Exit;
        end;
        if Ver[0,i]>Ver[1,i] then begin
          Result:=False;//服务器文件比本地旧
          Exit;
        end;
      end;
    end;procedure TFm_Update.FormShow(Sender: TObject);
    var TSize:DWORD;
        PathT:PChar;
    begin
      AdjustProcess;
      LocalFile:=Application.ExeName;
      try
        DB_Update.Params.Clear;
        DB_Update.Params.Add('User Name='+__DBUserName);
        if __DBUserName='TCManager' then
          DB_Update.Params.Add('Password=Longer');
        DB_Update.Open;
      Except
      End;
      GetVerInfo();
    {  if UpperCase(Trim(FileOrgName))<>UpperCase('xtwh.exe') then begin
        Btn_Select.Enabled:=False;
        Btn_Up.Enabled:=False;
      end;}
      TSize:=1000;
      GetMem(PathT,TSize);
      if GetTempPath(TSize,PathT)=0 then
        TempPath:=GetCurrentDir()
      else
        TempPath:=PathT;
      FreeMem(PathT,TSize);
      OD_UpFile.InitialDir:=GetCurrentDir;
    end;procedure TFm_Update.Btn_ExitClick(Sender: TObject);
    begin
      Close;
    end;procedure TFm_Update.Btn_UpClick(Sender: TObject);
    begin
      if Pos('winrar.exe',LowerCase(LocalFile))=0 then begin
        if ((Trim(Lab_Name4.Caption)='') or (Trim(Lab_Version4.Caption)='')) then begin
          MessageBox(self.Handle,'软件信息不全,无法分发!','错误',MB_ICONERROR);
          Exit;
        end;
        if ((Trim(Lab_Version3.Caption)<>'未知') and
            (CompareVersion(Trim(Lab_Version4.Caption),Trim(Lab_Version3.Caption)) )) then
          Exit;
        //判断Winrar.Exe是否存在
        if not GetRar then Exit;
        FileSetAttr(Trim(TempPath)+'FileUP.exe', 0);
        DeleteFile(TempPath+'FileUP.Rar');
        CopyFile(PChar(LocalFile),PChar(TempPath+FileOrgName),False);
        FileSetAttr(TempPath+FileOrgName, 0);
        if Pos('fdupdate.exe',LowerCase(LocalFile))=0 then
          LaunchApp(TempPath+'WinRar.exe a '+TempPath+'FileUp.Rar '+TempPath+FileOrgName+' -o+ -m5 -s -dh -y',
                    '',True,True);
      end;
      With QComm do begin
        Close;
        SQL.Clear;
        //增加
        SQL.Add('delete GY_FileUpdate where ProgramName=:FName ');
        SQL.Add('insert into GY_FileUpdate (ProgramName,CsName,Version,FileSize, '+
                '      FileDate,FileText,UpdateTime) values '+
                '      (:FName,:CName,:Ver,:FS,:FD,:FT,GetDate())');
        if Pos('winrar.exe',LowerCase(LocalFile))=0 then
          ParamByName('FName').AsString:=FileOrgName
        else
          ParamByName('FName').AsString:='WinRar.exe';
        ParamByName('CName').AsString:=Lab_Name4.Caption;
        ParamByName('Ver').AsString:=Lab_Version4.Caption;
        ParamByName('FS').AsString:=Lab_Size4.Caption;
        ParamByName('FD').AsString:=Lab_Date4.Caption;
        Ani_UpDown.Visible:=True;
        self.Update;
        if (Pos('winrar.exe',LowerCase(LocalFile))=0) and
           (Pos('fdupdate.exe',LowerCase(LocalFile))=0) then
          ParamByName('FT').LoadFromFile(TempPath+'FileUp.Rar',ftBlob)
        else
          ParamByName('FT').LoadFromFile(LocalFile,ftBlob);
        Try
          ExecSQL;
          Ani_UpDown.Visible:=False;
          GetVerInfo();
        Except
          On E:Exception do begin
            Ani_UpDown.Visible:=False;
            MessageBox(self.Handle,PChar('分发新软件时失败'+#13#10+
                       Trim(SysErrorMessage( GetLastError() ))),'错误',MB_ICONERROR);
            Exit;
          end;
        End;
      end;
      FileSetAttr(Trim(TempPath)+'WinRar.exe', 0);
      DeleteFile(TempPath+'WinRar.Exe');
      FileSetAttr(Trim(TempPath)+'FileUP.exe', 0);
      DeleteFile(TempPath+'FileUP.Rar');
      FileSetAttr(Trim(TempPath)+'FDUpdate.exe', 0);
      DeleteFile(TempPath+'FDUpdate.Exe');
    end;
      

  5.   

    procedure TFm_Update.Btn_SelectClick(Sender: TObject);
    begin
      if OD_UpFile.Execute then begin
        LocalFile:=OD_UpFile.FileName;
        GetVerInfo();
      end;
    end;procedure TFm_Update.Btn_DownClick(Sender: TObject);
    var
      Reg:TRegistry;
    begin
      if not GetRar then Exit;
      LocalFile:=Application.ExeName;
      GetVerInfo();
      if ((Trim(Lab_Name3.Caption)='未知') or (Trim(Lab_Version3.Caption)='未知')) then begin
        MessageBox(self.Handle,'已分发软件信息不全,无法下载分发软件更新!','错误',MB_ICONERROR);
        Exit;
      end;
      if not CompareVersion(Trim(Lab_Version4.Caption),Trim(Lab_Version3.Caption)) then
        if MessageBox(self.Handle,'已分发软件比本地软件旧,真的要将分发的软件下载更新吗?',
                      '询问',MB_ICONQUESTION+MB_YESNO+MB_DEFBUTTON2)=IDNO then Exit;
      With QComm do begin
        Close;
        SQL.Clear;
        SQL.Add('select ProgramName from GY_FileUpdate where ProgramName=:FileName ');
        ParamByName('FileName').AsString:=Trim(FileOrgName);
        Ani_UpDown.Visible:=True;
        self.Update;
        Open;
        Last;
        First;
        if IsEmpty or (RecordCount<>1) then begin
          MessageBox(self.Handle,'无此分发软件或信息不唯一,无法更新!','错误',MB_ICONERROR);
          Ani_UpDown.Visible:=False;
          GetVerInfo();
          Exit;
        end;
        if FileExists(Trim(TempPath)+FileOrgName) then begin
          FileSetAttr(Trim(TempPath)+FileOrgName, 0);
          if not DeleteFile(Trim(TempPath)+FileOrgName) then begin
            MessageBox(self.Handle,PChar('删除临时目录下的软件失败,不能更新!'+#13#10+
                       Trim(SysErrorMessage( GetLastError() )) ),'错误',MB_ICONERROR);
            Ani_UpDown.Visible:=False;
            Exit;
          end;
        end;
      end;//end with QCOMM
      //如果FDUpdate.exe存在则删除
      if FileExists(Trim(TempPath)+'FDUpdate.exe') then begin
        FileSetAttr(Trim(TempPath)+'FDUpdate.exe', 0);
        if not DeleteFile(Trim(TempPath)+'FDUpdate.exe') then begin
          MessageBox(self.Handle,PChar('删除临时目录下的FDUpdate文件失败!'+
                     Trim(SysErrorMessage( GetLastError() )) ),'错误',MB_ICONERROR);
          Exit;
        end;
      end;
      With Tab_Update do begin
        Active:=False;
        Filtered:=False;
        Filter:='ProgramName='''+'FDUpdate.exe'+'''';
        Try
          Active:=True;
          Filtered:=True;
        Except
          On E:Exception do begin
            MessageBox(self.Handle,PChar('下载更新程序FDUpdate.exe失败,无法更新!'+#13#10+
                       Trim(SysErrorMessage( GetLastError() )) ),'错误',MB_ICONERROR);
            Ani_UpDown.Visible:=False;
            GetVerInfo();
            Exit;
          end;
        End;
        FFT.SaveToFile(Trim(TempPath)+'FDUpdate.exe');
        Active:=False;
        Filtered:=False;
        Filter:='ProgramName='''+Trim(FileOrgName)+'''';
        Try
          Active:=True;
          Filtered:=True;
        Except
          On E:Exception do begin
            MessageBox(self.Handle,PChar('下载新软件失败,无法更新!'+#13#10+
                       Trim(SysErrorMessage( GetLastError() )) ),'错误',MB_ICONERROR);
            Ani_UpDown.Visible:=False;
            GetVerInfo();
            Exit;
          end;
        End;
        FileSetAttr(TempPath+'FileUP.Rar', 0);
        DeleteFile(TempPath+'FileUP.Rar');
        FFT.SaveToFile(Trim(TempPath)+'FileUP.Rar');
        Tab_Update.Active:=False;
        LaunchApp(TempPath+'WinRar.exe e '+TempPath+'FileUp.Rar '+TempPath+' -o+ -y ','',False,True);
      end;
      Reg:=TRegistry.Create;
      Reg.RootKey:=HKEY_LOCAL_MACHINE;
      Reg.OpenKey('Software',True);
      Reg.WriteString('FDUpdate1',Trim(TempPath)+FileOrgName);
      Reg.WriteString('FDUpdate2',LocalFile);
      Reg.WriteString('FDUpdateInfo',Lab_Name4.Caption);
      Reg.CloseKey;
      Reg.Free;
      Ani_UpDown.Visible:=False;
      LaunchApp(PChar(Trim(TempPath)+'FDUpdate.exe'),Trim(TempPath),True,False);
      Application.Terminate;
    end;function TFm_Update.GetRar:Boolean;
    begin
      With Tab_Update do begin
        Active:=False;
        Filtered:=False;
        Filter:='ProgramName='''+'WinRar.exe'+'''';
        //如果winrar.exe存在则删除
        if FileExists(Trim(TempPath)+'WinRar.exe') then begin
          FileSetAttr(Trim(TempPath)+'WinRar.exe', 0);
          if not DeleteFile(Trim(TempPath)+'WinRar.exe') then begin
            MessageBox(self.Handle,PChar('删除临时目录下的WinRar文件失败!'+
                       Trim(SysErrorMessage( GetLastError() )) ),'错误',MB_ICONERROR);
            Result:=False;
            Exit;
          end;
        end;
        Try
          Active:=True;
          Filtered:=True;
          if RecordCount<>1 then begin
            MessageBox(self.Handle,'下载解包工具WinRar.exe失败(数据库内不存在)!','错误',MB_ICONERROR);
            Result:=False;
            Exit;
          end;
          FFT.SaveToFile(Trim(TempPath)+'WinRar.exe');
          Result:=True;
          Active:=False;
          Filtered:=False;
        Except
          on E:Exception do begin
            MessageBox(self.Handle,PChar('下载解包工具WinRar.exe失败,无法更新!'+
                       #13#10+E.Message),'错误',MB_ICONERROR);
            Result:=False;
            Exit;
          end;
        End;
      end;//end with
    end;
      

  6.   

    Type TFileVersionInfo = Record
      FixedInfo:TVSFixedFileInfo;    {版本信息}
      CompanyName:String;            {公司名称}
      FileDescription:String;        {说明}
      FileVersion:String;            {文件版本}
      InternalName:String;           {内部名称}
      LegalCopyright:String;         {版权}
      LegalTrades:String;        {合法商标}
      OriginalFilename:String;       {源文件名}
      ProductName:String;            {产品名称}
      ProductVersion:String;         {产品版本}
      Comments:String;               {备注}
    end;
    //执行处部可执行文件
    Function LaunchApp(pExePath,WorkDir:String;ShowWindow,WaitFlag:Boolean):Boolean;
    var ExePath : array[0..512] of char;
        StartupInfo:TStartupInfo;
        ProcessInfo:TProcessInformation;
    begin
      StrPCopy(exePath, pExePath);
      FillChar(StartupInfo,Sizeof(StartupInfo),#0);
      StartupInfo.cb := Sizeof(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      if ShowWindow then
        StartupInfo.wShowWindow := 1
      else
        StartupInfo.wShowWindow := 0;
      if not CreateProcess(nil,
                          ExePath,
                          nil,
                          nil,
                          false,
                          CREATE_NEW_CONSOLE or
                          NORMAL_PRIORITY_CLASS,
                          nil,
                          nil,
                          StartupInfo,
                          ProcessInfo) then  begin
        Result:=False;
        Exit;
      end else begin
        if WaitFlag then
          WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
        Result:=True;
      end;
    end;Function GetFileVerInfo(ExeFileName :Pchar;var VerSionInfo:TFileVersionInfo):Boolean;
    var
      dwHandle, dwVersionSize   : DWORD;
      Find                      : String;
      pcBuffer                  : PChar;
      pTemp                     : Pointer;
      FileVersionInfo           : TVSFixedFileInfo;
    begin
      Find := '\';
      dwVersionSize := GetFileVersionInfoSize( PChar(ExeFilename),dwHandle );
      if dwVersionSize = 0 then  begin
        Result:=False;
        Exit;
      end;
      GetMem( pcBuffer, dwVersionSize );
      if not GetFileVersionInfo( PChar(ExeFilename),dwHandle,dwVersionSize,pcBuffer ) then begin
        FreeMem(pcBuffer);
        Result:=False;
        Exit;
      end;
      if not VerQueryValue( pcBuffer,PChar(Find),pTemp,dwVersionSize ) then begin
        FreeMem(pcBuffer);
        Result:=False;
        Exit;
      end;
      FileVersionInfo:=PVSFixedFileInfo(pTemp)^;
      With FileVersionInfo do begin
        VersionInfo.FixedInfo.dwSignature:=dwSignature;
        VersionInfo.FixedInfo.dwStrucVersion:=dwStrucVersion;
        VersionInfo.FixedInfo.dwFileVersionMS:=dwFileVersionMS;
        VersionInfo.FixedInfo.dwFileVersionLS:=dwFileVersionLS;
        VersionInfo.FixedInfo.dwProductVersionMS:=dwProductVersionMS;
        VersionInfo.FixedInfo.dwProductVersionLS:=dwProductVersionLS;
        VersionInfo.FixedInfo.dwFileFlagsMask:=FileVersionInfo.dwFileFlagsMask;
        VersionInfo.FixedInfo.dwFileFlags:=fileVersionInfo.dwFileFlags;
        VersionInfo.FixedInfo.dwFileOS:=FileVersionInfo.dwFileOS;
        VersionInfo.FixedInfo.dwFileType:=FileVersionInfo.dwFileType;
        VersionInfo.FixedInfo.dwFileSubtype:=FileVersionInfo.dwFileSubtype;
        VersionInfo.FixedInfo.dwFileDateMS:=FileVersionInfo.dwFileDateMS;
        VersionInfo.FixedInfo.dwFileDateLS:=FileVersionInfo.dwFileDateLS;
      end;
      Find := '\StringFileInfo\080403A8\';
      if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then
        VersionInfo.CompanyName:=PChar(pTemp)
      else begin
        Find := '\StringFileInfo\040904E4\';
        if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then
          VersionInfo.CompanyName:=PChar(pTemp)
        else begin
          Result:=False;
          Exit;
        end;
      end;
      if VerQueryValue( pcBuffer,PChar(Find+'FileDescription'),pTemp,dwVersionSize ) then
        VersionInfo.FileDescription:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'FileVersion'),pTemp,dwVersionSize ) then
        VersionInfo.FileVersion:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'InternalName'),pTemp,dwVersionSize ) then
        VersionInfo.InternalName:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'LegalCopyright'),pTemp,dwVersionSize ) then
        VersionInfo.LegalCopyright:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'LegalTrades'),pTemp,dwVersionSize ) then
        VersionInfo.LegalTrades:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'OriginalFilename'),pTemp,dwVersionSize ) then
        VersionInfo.OriginalFilename:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'ProductName'),pTemp,dwVersionSize ) then
        VersionInfo.ProductName:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'ProductVersion'),pTemp,dwVersionSize ) then
        VersionInfo.ProductVersion:=PChar(pTemp);  if VerQueryValue( pcBuffer,PChar(Find+'Comments'),pTemp,dwVersionSize ) then
        VersionInfo.Comments:=PChar(pTemp);
      FreeMem(pcBuffer );
      Result:=True;
    end;
      

  7.   

    program FDUpdate;uses
      Registry,
      SysUtils,
      Windows;{$R *.RES}
    var Reg:TRegistry;
        File1,File2,FileInfo:String;
        CopyOk:Boolean;
        ReTry:Integer;
    begin
      Reg:=TRegistry.Create;
      Try
        Reg.RootKey:=HKEY_LOCAL_MACHINE;
        Reg.OpenKey('Software',True);
        File1:=PChar(Reg.ReadString('FDUpdate1'));
        File2:=PChar(Reg.ReadString('FDUpdate2'));
        FileInfo:=PChar(Reg.ReadString('FDUpdateInfo'));
        if Trim(FileInfo)<>'' then
           FileInfo:='<'+FileInfo+'>';
        if not (((Trim(File1)='') or (Trim(File1)=''))) then begin
          ReTry:=0;
          CopyOk:=False;
          FileSetAttr(Trim(File2)+'.bak', 0);
          if CopyFile(PChar(File2),PChar(Trim(File2)+'.bak'),False) then
            MessageBox(0,PChar('原软件已经备份为'+File2+'.bak !'),'完成',MB_ICONINFORMATION);
          While not CopyOk do begin
            FileSetAttr(File1, 0);
            FileSetAttr(File2, 0);
            if CopyFile(PChar(File1),PChar(File2),False) then begin
              MessageBox(0,PChar(FileInfo+'已经完成更新!'),'完成',MB_ICONINFORMATION);
              Reg.WriteString('FDUpdate1','');
              Reg.WriteString('FDUpdate2','');
              Reg.WriteString('FDUpdateInfo','');
              CopyOk:=True;
              WinExec(PChar(File2),SW_SHOWNORMAL);
            end else begin
              CopyOk:=False;
              Sleep(2000);
              ReTry:=ReTry+1;
            end;
            if ReTry=10 then begin
              CopyOk:=True;
              MessageBox(0,PChar(FileInfo+'未完成更新!'+#13#10+
                     '错误信息:'+Trim(SysErrorMessage( GetLastError() )) ),'错误',MB_ICONERROR);
            end;
          end;//end while CopyOk not True
        end;
      Finally
        Reg.CloseKey;
        Reg.Free;
      End;
    end.
      

  8.   

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GY_FileUpdate]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[GY_FileUpdate]
    GOCREATE TABLE [dbo].[GY_FileUpdate] (
    [ProgramName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [CsName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [Version] [char] (30) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [FileSize] [int] NOT NULL ,
    [FileDate] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
    [FileText] [image] NOT NULL ,
    [UpdateTime] [datetime] NOT NULL 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
      

  9.   

    谢谢,不过我是想通过网上的TXT文件或者INI来获取需要更新的软件信息,而且要同时显示多个软件,根据TXT或者INI的信息来显示。能发源代码给我吗?能用马上给分。
      

  10.   

    我刚到DELPHI来,不太清楚DELPHI怎么做,但我以前是用PB做的,我有PB的源程序!
      

  11.   

    belllab(bell) ( )  真是NB人呀,偶像
      

  12.   

    belllab(bell),佩服,虽然我还没有试过做,但我相信你的高见一定是我的参考。谢谢