如何做自動更新程式? |
答題得分者是:shunaaron
|
tomc
一般會員 發表:41 回覆:35 積分:15 註冊:2003-07-27 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
shunaaron
高階會員 發表:13 回覆:94 積分:106 註冊:2006-10-06 發送簡訊給我 |
方式有很多
提一個做法 用一個Tabel去記錄版本訊息 程式撰寫時,寫入目前版本 當使用者版本和Tabe不同時,就是要更新 將你新的檔案放至FTP上 在寫一個抓取更新檔的程式 因為主程式在執行 是沒法更新的 流程如下.. 使用者目前使用的系統 -A 主系統的更新檔 -B 抓取新主系統的程式 -C A-->有更新檔-->至FTP抓C-->關A->Run C -->Delete A --> Get B-->end ===================引 用 tomc 文 章=================== 我的想法是將當前程式的編譯更新日期或版本號,與伺服器上的編譯更新日期或版本號作比較 如果不一至,則從服務器上download下來 問題是: 1、怎么知道當前運行程式的更新日期呢(版本號可以獲得,但每次編譯要更新一下版本號)? 2、如何實現從伺服器上download到到本機 3、如果更新當前正在運行的程式呢?
------
程式沒有這麼難 只是還沒打通其中要絕 |
tomc
一般會員 發表:41 回覆:35 積分:15 註冊:2003-07-27 發送簡訊給我 |
[code delphi] function GetVersionString(FileName: string): string; //得到文件版本 var VerInfoSize: DWORD; VerInfo: Pointer; VerValueSize: DWORD; Dummy: DWORD; VerValue: PVSFixedFileInfo; begin Result := ''; VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy); if VerInfoSize = 0 then Exit; GetMem(VerInfo, VerInfoSize); GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, VerInfo); VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize); Result := IntToStr(VerValue^.dwFileVersionMS shr 16) '.' IntToStr(VerValue^.dwFileVersionMS and $FFFF) '.' IntToStr(VerValue^.dwFileVersionLS shr 16) '.' IntToStr(VerValue^.dwFileVersionLS and $FFFF); FreeMem(VerInfo); end; function GetFileCreationTime(const Filename: string): TDateTime; //获应用程序时间 var Data: TWin32FindData; H: THandle; FT: TFileTime; I: Integer; begin { Data.ftCreationTime: TFileTime; //创建时间 Data.ftLastAccessTime: TFileTime; //最后访问时间 Data.ftLastWriteTime: TFileTime; //最后修改时间 } H := FindFirstFile(PCHAR(Filename), Data); if H <> INVALID_HANDLE_VALUE then begin try FileTimeToLocalFileTime(Data.ftLastWriteTime, FT); FileTimeToDosDateTime(FT, LongRec(I).Hi, LongRec(I).Lo); Result := FileDateToDateTime(I); finally Windows.FindClose(H); end end else begin Result := 0; end; end; procedure TForm1.Button1Click(Sender: TObject); var exeFn:string; //程序名 exeFnP:string; //文件全名 exeLastUpdate:TDateTime; //最后更新时间 exeVer:string; //版本号; dbLastUpdate:TDateTime; begin exeFnP:=application.exename; //获文件全名(含路径) exeFn:=extractfilename(exeFnP); //获程序名(不含路径) exeLastUpdate:=GetFileCreationTime(exeFnP); exeVer:=GetVersionString(exeFnP); adoquery1.SQL.Clear; adoquery1.SQL.Text:='select * from Ver where fileName=''' exeFn ''''; adoquery1.Open; if not adoquery1.Eof then begin dbLastUpdate:=adoquery1.fieldbyname('FileUpdate').Value; end else begin //如果没有记录,写入新记录 adoquery1.Append; adoquery1.FieldByName('Filename').Value:=exeFn; adoquery1.FieldByName('FileVer').Value:=exeVer; adoquery1.FieldByName('FileUpdate').Value:=exeLastUpdate; adoquery1.Post; end; if dbLastUpdate adoquery1.Edit; adoquery1.FieldByName('Filename').Value:=exeFn; adoquery1.FieldByName('FileVer').Value:=exeVer; adoquery1.FieldByName('FileUpdate').Value:=exeLastUpdate; adoquery1.Post; end; if dbLastUpdate>exeLastUpdate then //程序版本不是最新版本 application.MessageBox(pchar(exeFn '已有新的版本,请升级至最新版本!'),'升级提示',MB_OK MB_ICONEXCLAMATION); memo1.text:=datetimetostr(dbLastUpdate) '><' datetimetoStr(exeLastUpdate); end; 以上是版本检测的已经完成 现在如果下载新版本和更新新版本的问题还未解决, 试一下按shuaaron大大的思路做一下 [/code]
------
交流.學習 |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |