程序如下:
可执行文件一个,含有多个DLL文件,如何能让此系统自动更新可执行文件和DLL文件!希望大家能提供好的思路!
谢谢!

解决方案 »

  1.   

    我有一个想法,就是采用一个表来记录相应的文件,及包含的DLL等文件
    然后通过可执行文件中的自动更新程序来通过版本进行自动更新操作!
    请问高手有没有更好的思路!分数可以在加!
      

  2.   

    我通过一个INI文件记录要更新的文件,然后再让程序检测是否下载更新,不知哪一位大侠有办法自动得到网上文件的一些属性,可以让应用程序的一些属性来判断是否更新
      

  3.   

    >>,就是采用一个表来记录相应的文件,及包含的DLL等文件
    记录文件名与对应版本号了!!最好,更新的程序独立做成个程序!!!在csdn上有好几篇文档都是讨论自动更新的!!
      

  4.   

    简单的在线升级的实现方法 csdn作者:徐长友
        用过一般的杀毒软件,都知道,启动程序时,常会问,网上已经有新版本的,是否升级之类的提示,现在越来越多的软件都支持在线升级,
    你是否也想实现这个功能?本文就是如何实现在线升级,讲述一下如何通过HTTP检测是否需要下载升级版本,并下载升级。
    实现方法:
      1、网站提供升级信息。
      2、使用HTTP从网站下载升级信息。
      3、确定是否进行升级,升级程序下面我们定义一下升级信息:
      [文件名1]
      datetime=时间
      [文件名2]
      datetime=时间  
    存为HTML文件,如定义一个update.htm
    [programe1.exe]
    datetime=2003-07-06
    [programe1.hlp]
    datetime=2003-07-06这里只是简单的判断一下文件的时间,如果时间比需要升级的文件时间小的,表示要下载新版本升级它。当然要做到十全十美,这是判断是不合理的,这里只作个简单的介绍。
    写个fuction,判断是否有新的版本要升级function ExistNewFile:boolean;
    var i,iFileHandle:integer;
        FileDateTime:TDateTime;
        AppIni:TiniFile;
        g_path:string;
        http://www.csdn.net/develop/string;
        files:TStrings;
    begin
       result:=false;
       http://www.csdn.net/develop/='http://yousoft.hi.com.cn/update.htm';    //要升级的服务器
       g_path:=ExtractFilePath(application.ExeName);  //升级程序的路径
       if copy(g_path,length(g_path),1)<>'\' then g_path:=g_path+'\';
       if copy(url,length(url),1)<>'/' then http://www.csdn.net/develop/=url+'/';  //下载升级信息文件
       try
          HTTPFiles.InputFileMode := true;
          HTTPFiles.OutputFileMode := FALSE;
          HTTPFiles.ReportLevel := Status_Basic;
          HTTPFiles.Body:=g_path+'update/update.ini';   //下载后保存到程序的update目录下
          HTTPFiles.Get(url);
       except
          result:=false; //'取得升级信息出错!,不用再继续
          exit;
       end;
       try
                  files:=TStringlist.Create;      //有哪些文件?
                  AppIni := TIniFile.Create(g_path+'\update\update.ini');
                  AppIni.ReadSections(files);
                  for i:=0 to files.Count-1 do
                  try
                         iFileHandle :=FileOpen(g_path+files[i],fmShareDenyNone);
                         FileDateTime:=FileDateToDateTime(FileGetDate(iFileHandle)); //取得文件时间
                         FileClose(iFileHandle);
                         //是否要下载文件
                         if FileDateTime<strtodatetime(Appini.ReadString(files[i],'datetime','1900-1-1')) then
                         begin
                                result:=true;
                                break;
                         end;
                  except
                  end;
       finally
                  AppIni.free;
                  files.Free;
       end;
    end;取得files后文件下载!httpfiles为TNMHTTP
          HTTPFiles.InputFileMode := true;
          HTTPFiles.OutputFileMode := FALSE;
          HTTPFiles.ReportLevel := Status_Basic;
          HTTPFiles.Body:=g_path+'update/'+files[i];  
          HTTPFiles.Get(url);把下载后的文件复制到原程序,并备份出一份
          for i:=0 to files.Count-1 do    //备份文件
          begin
             //备份一份文件出来
             copyfile(pchar(g_path+files[i]),pchar(g_path+files[i]+'.bak'),false);
          end;
          for i:=0 to files.Count-1 do    //从update复制新文件
          begin
             copyfile(pchar(g_path+'update\'+files[i]),pchar(g_path+files[i]),false);
          end;
    因为采用了TNMHTTP,文件下载的进度并不是很好控制,可以在TNMHTTP的PacketRecvd事件,确定进度
    到这里基本方法就介绍完了,在DELPHI6+WIN2000环境调试通过,这里我没有写出完整的代码,有兴趣可以自己写写,多加改善
    在我的主页我做了演示程序,大家可以看看网址是:http://yousoft.hi.com.cn/
      

  5.   

    朋友们最好是看清楚我的问题,我不是无法实现自动更新!
    上面的同志更新程序就不用写了,我自己会写!
    我只是想让大家发表一下自动更新的好的想法!比如我有一个程序,程序中含有一个可执行文件,和多个数据文件以及DLL文件!我怎么能让我的自动更新知道!到底哪个DLL文件或者数据文件有了新的版本!
    我的想法是建议一个数据文件来记录可执行文件和数据文件以及DLL文件的名称,
    然后通过版本号进行自动更新,有其他更好的办法没有!???/
      

  6.   

    你上面写的有一点问题,比如!版本1       版本2          版本3a1文件------需要升级----不需要升级
    a2文件------需要升级------需要升级
    a3文件------需要升级------需要升级
    a4文件------需要升级------需要升级
    a5文件-----不需要升级------需要升级按照你的程序的写法:我由版本升级到版本2的时候,和我由版本1直接升级到版本3的时候,
                      需要加的升级文件是不同的,但我作为服务器,我并不知道客户是由
                      版本1升级到版本,还是有版本升级到版本的啊!
    就算是知道的话,那你也不可能这样写吧:
    if 用户使用的是版本1 then
      tstringlist=....;
    if 用户使用的是版本2 then
      tstringlist=....;
      

  7.   

    据我所知只有网络程序中的OCX
    插件才有自动版本识别和自动更新的功能。
    只要你在向导中适当地钩选就行了!       ^_^
      

  8.   

    正常只是简单的比较下版本号,
    如果象你说的, 还有不同版本,不同升级需要!那我建议在服务器中保存一份更新列表, 
     client端要求更新时,先将自己的版本号列表上传,
    sever再根据查表得到新的更新表,传给client
      

  9.   

    我觉得还是徐长友的更新方式好些。
    先在本地设置一个INI文件,写上各文件的建立或更改时间,在网络上设置一个升级文件。里面使用INI技术设置升级信息:文件名、时间等。然后把这些信息与本地文件的信息比较。如果信息是新的,则可以更新该文件,并把这些信息列出来。升级后,将信息文件的信息修改成最新的信息即可。
    同时要编写一个升级程序,里面设置文件信息处理、升级功能即可。
      

  10.   

    你每次更新都记下版本号,然后定时对现有的dll的版本做检查。
      

  11.   

    请问如何得知我的可执行文件中调用了多少的DLL文件名称都是什么?
      

  12.   

    1.把你的可执行文件和Dll文件的版本信息记录在一个.ini文件中
    2.在远程服务器存放可执行文件、DLL文件最新版本,及这些文件的版本信息;每次升级时只需要更新最新的文件及其版本信息。
    3.本地软件只要在启动时,下载版本信息和本地进行比较;如果版本比服务器上旧就提示下载更新。同时更新ini文件。
    为了防止本地的ini丢失一定要加一个搜索应用程序下,dll和exe文件的功能来恢复ini文件。
      

  13.   

    请问如何得知我的可执行文件中调用了多少的DLL文件名称都是什么?
    ----------------------------------------------------------------
    难道你更新的是别人的程序?自己写的怎么会不知道?我认为只要在本地和服务器各维护一份更新列表,简单的通过比较每个可执行程序的版本号,直接下载覆盖,哪有那么复杂啊?根本不用管你是Ver1到Ver3或Ver4到Ver5,反正一下就到最新版