网上看到一个程序升级步骤是这样的:
 软件第一次运行,估计是后台检查http上有无更新文件;不管有没有更新文件,此次运行 不出现如何升级提示。
 第二次运行时该软件时 软件在任务栏中自动更新到最新版后再自动打开软件。
 单文件升级,请告知源码!
谢谢,新人第一个帖子,希望能有高人指点!

解决方案 »

  1.   

    1 首先检测HTTP的相对目录下是否有文件,如有文件还要检测日期是否是必‘自己’新。
    2 如比自己新,则下载。
    3 重新启动时候本地覆盖掉原文件。
      

  2.   

    在主程序中A检测是否有新版本,如果有就打开升级程序B并关闭A,下载并替换主程序,打开A主程序并关闭自己B。
    主要就用下面的语句了。ShellExecute(handle, 'Open', PChar(fileName), nil, nil, SW_NORMAL);
      

  3.   

    替换可以参考自杀程序...简单的方案
    在你关闭的时候 运行一个 bat比如 ping 127.0.0.1 
    copy  a.tmp  a.exe
    用 SW_HIDE 模式这样就会自动替换掉了.
      

  4.   

    function GetBuildInfo: string; //获取版本号
    var
    verinfosize : DWORD;
    verinfo : pointer;
    vervaluesize : dword;
    vervalue : pvsfixedfileinfo;
    dummy : dword;
    v1,v2,v3,v4 : word;
    begin
    verinfosize := getfileversioninfosize(pchar(paramstr(0)),dummy);
    if verinfosize = 0 then begin
    dummy := getlasterror;
    result := '0.0.0.0';
    end;
    getmem(verinfo,verinfosize);
    getfileversioninfo(pchar(paramstr(0)),0,verinfosize,verinfo);
    verqueryvalue(verinfo,'\',pointer(vervalue),vervaluesize);
    with vervalue^ do begin
    v1 := dwfileversionms shr 16;
    v2 := dwfileversionms and $ffff;
    v3 := dwfileversionls shr 16;
    v4 := dwfileversionls and $ffff;
    end;
    result := inttostr(v1) + '.' + inttostr(v2) + '.' + inttostr(v3) + '.' + inttostr(v4);
    freemem(verinfo,verinfosize);
    end;
    //将新版本号写道页面的version id中;读取新版本号
    newver:=WebBrowser1.OleObject.document.parentWindow.version.innerText; //获取新版本号
    oldver:= GetBuildInfo;    //获取当前软件版本号
    if Trim(newver)='' then newver:= oldver ;
    nver:= strtoint(StringReplace(newver,'.','',[rfReplaceAll]));
    over:= strtoint(StringReplace(oldver,'.','',[rfReplaceAll]));if nver>over then
       begin      if MessageBox(Handle,'发现新版本,点击确定后下载','提示',MB_OKCANCEL)=1 then
          begin        MyStream:=TMemoryStream.Create;
            idhttp1.HandleRedirects:=true;
            idhttp1.ReadTimeout:=60000;
            try
            IdHTTP1.Get('http://升级的程序名.exe,MyStream);
            except
            Showmessage('网络出错!');
            MyStream.Free;
            Exit;
            end;
            MyStream.SaveToFile(ExtractFilePath(ParamStr(0))+inttostr(nver)+'.exe');
            MyStream.Free;   //下载完成
            BatchFileName := ExtractFilePath(ParamStr(0)) + 'update.bat';
            AssignFile(BatchFile, BatchFileName);
            Rewrite(BatchFile); //开始向这个bat文件写入内容
            Writeln(BatchFile,'@echo off');
            Writeln(BatchFile,':try');
            Writeln(BatchFile, 'del "' + ParamStr(0) + '"');
            Writeln(BatchFile, 'if exist "' + ParamStr(0) + '"' + ' goto try');
            //-----------
            Writeln(BatchFile,':loop');
            Writeln(BatchFile,'copy "' +inttostr(nver)+'.exe" '  +' "'  +ExtractFilePath(ParamStr(0))+ExtractFileName(ParamStr(0))+'"');
            Writeln(BatchFile, 'if not exist "' + ParamStr(0) + '"' + ' goto loop');
            //-----------
            Writeln(BatchFile, 'del "' + ExtractFilePath(ParamStr(0))+inttostr(nver)+'.exe ' + '"');
            Writeln(BatchFile, 'del %0');
            CloseFile(BatchFile);  //写入内容结束
            WinExec('update.bat', SW_HIDE);
            DeleteSelf;
          //  ShowMessage();
          end;
       end
     else
       begin
         MessageBox(Handle,'当前版本为最新版本','提示',MB_OK)
       end;end;以上是我找的代码,并测试ok,请各位指点,谢谢了!