線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3677
推到 Plurk!
推到 Facebook!

如何做自動更新程式?

答題得分者是:shunaaron
tomc
一般會員


發表:41
回覆:35
積分:15
註冊:2003-07-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-05-24 09:51:42 IP:116.18.xxx.xxx 訂閱
我的想法是將當前程式的編譯更新日期或版本號,與伺服器上的編譯更新日期或版本號作比較
如果不一至,則從服務器上download下來

問題是:
1、怎么知道當前運行程式的更新日期呢(版本號可以獲得,但每次編譯要更新一下版本號)?
2、如何實現從伺服器上download到到本機
3、如果更新當前正在運行的程式呢?
------
交流.學習
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-05-24 10:30:10 IP:61.67.xxx.xxx 未訂閱
請先搜尋本站, 其實有多相關討論了!
shunaaron
高階會員


發表:13
回覆:94
積分:106
註冊:2006-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-05-24 10:45:25 IP:220.134.xxx.xxx 訂閱
方式有很多
提一個做法
用一個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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-05-24 11:38:08 IP:116.18.xxx.xxx 訂閱

[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 begin
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-05-24 11:39:54 IP:75.35.xxx.xxx 未訂閱
Please check out a link as below, and search this site first next time.

http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=86886
===================引 用 P.D. 文 章===================
請先搜尋本站, 其實有多相關討論了!
系統時間:2024-04-19 23:27:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!