程序如下:
可执行文件一个,含有多个DLL文件,如何能让此系统自动更新可执行文件和DLL文件!希望大家能提供好的思路!
谢谢!
可执行文件一个,含有多个DLL文件,如何能让此系统自动更新可执行文件和DLL文件!希望大家能提供好的思路!
谢谢!
解决方案 »
- 心情好,散分
- 请大家帮我看一下啊.错误在那里?????里面有代码!
- 公式設計器下載(支技delphi常用函數,ACCESS及sql server大部分函數)
- 安装EhLib控件包是老是包File not found 'dbsumlst.dcu',为什么?怎么办?
- 哪位朋友帮忙给个有效的基础delphi教程电子版的下载阿。
- messagedlg使用问题
- 高分求购DevExpress WebFramework 1.12!!!最多1000分!
- SetWindowPos函数使用后,窗体上的按钮不能用
- 请问:怎样将所看见的stretch了的图画保存下来?
- 制作一个仓库系统,如何将定义好的指针变量清空
- 急求比较漂亮的button按钮啊!(也就是button类的第三方控件啊!)
- 关于“异或”的问题!!
然后通过可执行文件中的自动更新程序来通过版本进行自动更新操作!
请问高手有没有更好的思路!分数可以在加!
记录文件名与对应版本号了!!最好,更新的程序独立做成个程序!!!在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/
上面的同志更新程序就不用写了,我自己会写!
我只是想让大家发表一下自动更新的好的想法!比如我有一个程序,程序中含有一个可执行文件,和多个数据文件以及DLL文件!我怎么能让我的自动更新知道!到底哪个DLL文件或者数据文件有了新的版本!
我的想法是建议一个数据文件来记录可执行文件和数据文件以及DLL文件的名称,
然后通过版本号进行自动更新,有其他更好的办法没有!???/
a2文件------需要升级------需要升级
a3文件------需要升级------需要升级
a4文件------需要升级------需要升级
a5文件-----不需要升级------需要升级按照你的程序的写法:我由版本升级到版本2的时候,和我由版本1直接升级到版本3的时候,
需要加的升级文件是不同的,但我作为服务器,我并不知道客户是由
版本1升级到版本,还是有版本升级到版本的啊!
就算是知道的话,那你也不可能这样写吧:
if 用户使用的是版本1 then
tstringlist=....;
if 用户使用的是版本2 then
tstringlist=....;
插件才有自动版本识别和自动更新的功能。
只要你在向导中适当地钩选就行了! ^_^
如果象你说的, 还有不同版本,不同升级需要!那我建议在服务器中保存一份更新列表,
client端要求更新时,先将自己的版本号列表上传,
sever再根据查表得到新的更新表,传给client
先在本地设置一个INI文件,写上各文件的建立或更改时间,在网络上设置一个升级文件。里面使用INI技术设置升级信息:文件名、时间等。然后把这些信息与本地文件的信息比较。如果信息是新的,则可以更新该文件,并把这些信息列出来。升级后,将信息文件的信息修改成最新的信息即可。
同时要编写一个升级程序,里面设置文件信息处理、升级功能即可。
2.在远程服务器存放可执行文件、DLL文件最新版本,及这些文件的版本信息;每次升级时只需要更新最新的文件及其版本信息。
3.本地软件只要在启动时,下载版本信息和本地进行比较;如果版本比服务器上旧就提示下载更新。同时更新ini文件。
为了防止本地的ini丢失一定要加一个搜索应用程序下,dll和exe文件的功能来恢复ini文件。
----------------------------------------------------------------
难道你更新的是别人的程序?自己写的怎么会不知道?我认为只要在本地和服务器各维护一份更新列表,简单的通过比较每个可执行程序的版本号,直接下载覆盖,哪有那么复杂啊?根本不用管你是Ver1到Ver3或Ver4到Ver5,反正一下就到最新版