我的軟件要做到自動升級﹗急﹗(200分)

  • 主题发起人 主题发起人 databox
  • 开始时间 开始时间
D

databox

Unregistered / Unconfirmed
GUEST, unregistred user!
程序改了一點點就又去重新安裝客戶端﹐真是煩﹗
我的想法如下﹐請大家幫忙出謀划策。
1.我想程序每次啟動時﹐去服務器上判斷是否有新版本﹐若有﹐就COPY下來。分兩種﹐
一種是區域網﹕如Server1機器下的Public目錄。
一種是互聯網﹕如http://xxx.xxx.com/Update/server.exe﹐
其中還要考慮﹐若這會兒不在網上﹐不管是互聯網還是局域網﹐都不管它﹐執行現有程序。
2.COPY下來之后﹐怎么即時更新掉呢﹖我就是一個EXE文件﹐請針對這個問題﹐不要說專門
做一個UPDATE程序﹐這樣子我自己就會了。
小弟菜烏﹐希望能見到一些源碼﹐我這個情況比較緊急﹐因為后天就有客人要來看﹐若我發
現問題還可以借這個搞定﹐不然﹐我就慘啦。若哪位大俠有這方面的UPDATE代碼﹐請通知小
弟﹐小弟高分送上。
 
一点思路,
把程序分成两部分,第一部分升级用,第二部分完成功能.
数据库中加一个状态信息.
程序的第一部分启动后判断数据库中的状态,如果需要更新则下载文件,并覆盖,
如果不需要更新则调用第二部分,启动.
 
1.改为B/S结构
2.或者在注册表中记录程序安装时所在位置, 有一个专门的更新程序(此程序可以安装时
加在开始菜单中)来将新程序下载并覆盖到旧程序上。
 
我这样想的,程序部分功能于上面所述相同都是到服务器检查版本信息,下在新版本。
在更新的时候,如果想立即更新,就在程序里执行改名功能,把本程序改名(以备下载更新程序不同名),然后运行搞版本程序,同时删掉本程序(退出时自动生成批处理文件完成删除功能,或者用更新的程序删掉就程序)。
如果不需要马上更新,可以修改initwin.ini(大概是这个名字,许多软件都是这样做的),下次启动时执行更新操作。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=593599
http://www.delphibbs.com/delphibbs/dispq.asp?lid=495634

 
同意 Brave 大侠(高手,佩服)的思路
 
有一个现成的控件可以完成你要的功能,你去深度历险看看。[8D]
 
我的想法:
分两个程序,一个是外壳程序,负责检查版本,连网下载更新,启动主程序等操作
第二个是主程序,运行你的业务,要更新的也就是这个EXE,这样的话你就不用说在EXE
运行的时候替换自己了。程序启动时(在用户看来只是一个程序),检查是否有更新,有
则下载并运行新下载来的这个版本,主程序运行过程中也可以检查是否有最新版本可更
新,如有则调用外売程序并退出自身,然后由外売程序来完成更新操作。这些都可以做
到用户完全透明的。
 
同意Xianjun的想法!
 
可以把源代码贴出来看看吗?
 
这么简单的问题,你也问?[:D]
 
:)讲就容易,做出来再说
 
玩过联众吧,差不多,不过联众程序是Dll,我做过一个类似程序在后台数据库里面
存放一张表对应记录在Exe文件的版本号Ip地址端口号,User,
Password,Exe文件名称(我用的是Ftp下载)
本地有一张表或者Ini文件到时候对比以后就可以进行下载判断了
还有如果你不知道的话:Delphi调用Exe文件的方式是WinExex(FileName,int)
{int是多少我不记得了你试试看都可以调用出来}
 
對呀﹐哪位能貼出點實用的代碼出來嗎﹖[:(]
 
已经说得很清楚了! 写代码只是举手之劳,你为什么就不自己写呢?[:(!]
 
小弟是菜鸟一只,别人说的菜鸟就关心源代码,[:D]
下面说说我程序中的问题.
在win2000下,可以发觉版本有误,也可以正常换掉,但我事先COPY了一份BAK,在BAT中写删除
却没删掉?
在win98下问题就多了.
我在win2000下用D6写的程序,他根本就发觉不了版本差别,我改到win98下用D5来说,他却一
遍一遍提示我更新版本,我点了YES后,他接着执行,我跟踪断点,发现他也执行了,但却没有换
掉,我换掉后又要调用此程序,于是又提示我更换版本?为什么换不掉呢?
为何我win2000下写的不管用,难道我要写两个版本的程序吗?这就惨了,因为D6的源代码拿到
D5下根本就用不了.
 
比较的我想你应该知道了吧?给你贴点替换的.
procedure ChangeFile(SourceFile,TargetFile:string);
var F:TextFile;
FileName:string;
begin
FileName:=ExtractFileName(SourceFile);
CopyFile(PChar(TargetFile),PChar(SourceFile+'.Bak'),False);
AsSignFile(F,'ChangeFile.bat');
Rewrite(F);
Writeln(F,'ren '+FileName+' '+FileName+'.old');
Writeln(F,'ren '+FileName+'.bak'+' '+FileName);
Writeln(F,'del '+FileName+'.old');
Writeln(F,'del %0');
CloseFile(F);
WinEXEc('ChangeFile.bat',SW_HIDE);
Sleep(1000);
WinEXEc(PChar(SourceFile),SW_SHOW);//这儿重新运行你的程序.
end;
 
把一些东东(属性,方法,事件),做到一个DLL文件里去,如果要更新,等于是更新这
个DLL文件。
不知道各位大虾是否认同我这个想法。
 
我突然想到一個問題﹐有的人都說加載包或者是DLL﹐若別人將你的外挂程序掉了包﹐即將
密碼部分去掉﹐甚至換作另一個登錄窗口﹐甚至直接載入你的程序包﹐豈不就可直接用了﹖
想問大伙兒﹐你們在包中怎么防止這個問題呢﹖
 
将需要升级的部分做成模块(例如dll),升级dll就行了,多方便呀 [:)]
 
后退
顶部