我现在的做法是程序运行时,先看数据库中表a的字段是否等于写死在程序中的某个字符,如"V1.0版",每次我改了程序时,会先修改这个字符,如改为"V12.0版",再在数据库中把表a中字段的内容也改成一样的。用户在客户端运行程序时,如果是旧版本,就不能运行,就要自己去公共盘考下最新的系统把旧的覆盖才可以用。我看到许多系统都可以在客户端自动更新,而不用自己拷贝新程序,请问是如何做到的?可否提供一段代码?谢谢!

解决方案 »

  1.   

    主程序和更新程序分开啊!
       主程序可以做成DLL,或干脆改成其他扩展名.也可以不改,看情况.
       每次首先运行更新程序,检查是否有更新,有的话就"拿"过来(COPY/SOCKET传输等等,根据传输通道的形式),更新结束或者没更新的话才去运行主程序.
      

  2.   

    你可以在服务器上建一个HTTP或FTP,把你的最新程序放在这里面,再建一上文件文件,里面写上最新程序的版本号,当客户端程序启动时就以HTTP或FTP的方式把服务器上写着版本号的那个文本文件载下来,比较本机的客户端版本号和这个文本文件里的版本号,如果发现小于最新版本号,就下载安装就行了,你可以把最新的程序做成安装程序,载下来后自动运行安装程序,也可以只放需要更新的文件,那你就需要把所有文件都载下来后挨个替换,当程序本身也需要替换的时候可以用以下代码
    procedure TForm1.UpdateSelf;
    var f: textfile;
    begin
      AssignFile(f, RootPath+'\UpdateSelf.bat');
      Rewrite(f);
      writeln(f, '@echo off');
      writeln(f, ':loop');
      Writeln(f, 'del .\'+ExtractFileName(Application.ExeName));
      Writeln(f, 'ren '+RootPath+'\NewServerUpdate.exe'+' ServerUpdate.exe');
      writeln(f, 'if exist .\NewServerUpdate.exe  goto loop');
      {if IsAuto then
         Writeln(f, RootPath+'\ServerUpdate.exe Auto')
      else
         Writeln(f, RootPath+'\ServerUpdate.exe');}
      Writeln(f, 'del .\UpdateSelf.bat');
      CloseFile(f);
      WinExec(PChar(ExtracTFilePath(Application.ExeName)+'UpdateSelf.bat'), SW_HIDE);
    end;
      

  3.   

    我的做法是启动一个update.exe,由它从升级服务器下载文件,下载完成后,再提示用户升级,升级过程先关闭主程序,再复制更新文件,提示用户重启动软件即可。向楼主推荐免费产品:Visession Anyupdate自动升级软件系统
    免费将自动升级功能加入您的软件产品中
    网站:http://www.visession.com/anyupdate
    下载:http://www.visession.com/anyupdate/DownLoad.htm
      

  4.   

    我的做法是,每次判断本地程序与服务器上程序的最后一次修改时间,如果本地的小于服务器上的,就提示升级。
    函数如下function HasNewAppVer(ServerFilePath, LocalFilePath: string): Boolean;
    const
      Model = 'yyyymmddhhmmss'; 
    var
      Tp: TSearchRec; 
      ServerWriteTime ,LocalWriteTime :String ;
    begin
      if (FileExists(ServerFilePath)) and (FileExists(LocFilePath)) then
      begin
        FindFirst(ServerFilePath, faAnyFile, Tp);
        ServerWriteTime := FormatDateTime(Model, CovFileDate(Tp.FindData.ftLastWriteTime));
        FindFirst(LocalFilePath, faAnyFile, Tp);
        LocalWriteTime := FormatDateTime(Model, CovFileDate(Tp.FindData.ftLastWriteTime));
        if StrToInt64(ServerWriteTime ) > StrToInt64(LocalWriteTime ) then
          Result := True        
        else Result := False;
      end
      else
        Result := False;
    end;
      

  5.   

    我们是在局域网内使用,所以是在服务器上建一个共享文件夹,判断是按照服务器上文件的日期和本地的文件 的日期进行比较,如不同,提示后,更新。
    但近来发现一个问题。
    之前是用D7,用CopyFile拷贝文件时,没什么问题。
    现在是用的D2010,用CopyFile拷贝文件时,好像有一个人在拷贝时,另一个人拷贝时就报错,只有等另一个人拷贝完了,再拷贝就没问题了。