delphi 自动更新cs客户端的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi 自动更新cs客户端的问题相关的知识,希望对你有一定的参考价值。

我在程序做了个版本号,然后放了个版本号到服务器,准备是检测客户端程序版本号<服务器版本号的时候,用ftp的方式去服务器下载最新的程序,替换到本地的客户端程序。
但问题在于:我用本地客户端程序去下载服务器的程序,无法去覆盖本地的程序文件啊,覆盖的时候会提示“cannot create file,另一个程序正在使用文件”。因为覆盖文件必须要先退出本地程序文件才能覆盖的,而退出本地程序,下载ftp的命令又无法执行了,所以就矛盾在这里了,请问如何解决

楼上所说的是比较常用的方法,也是可行的。通常,一些应用程序会在目录下加个Update目录,里面就放从服务端下载来的更新数据文件,以供下次运行程序时升级用(没有即时升级这个功能,也很难实现,除非你不需要更新主程序文件)。至于如何完成这个更新过程,楼上的已经说的比较清楚了,我就不再重复。
另外有种方法: 动态脚本,即使程序运行在解释状态。像java一样,是解释型程序而不是编译型程序,解释的好处是可以用脚本来实现程序的功能,是可以实现在程序运行过程中动态升级的,像web程序一样,只需要刷新一下界面就行了,你要做的,就是在客户端检测一下服务端的版本号,如果小于服务端版本号,则下载最新的脚本到本地即时执行。现在支持object pascal脚本的控件比较多,你在网上搜一下就好了,在CPU这么强大的今天,程序运行的速度也不会比完全编译慢多少。当然,这样做的缺点是,你如何保证你的脚本(业务逻辑)的安全性!如果不嫌麻烦,你大可以给你的脚本加密传输,执行的时候解一下密就好了。

第三种方法:
有些游戏程序的做法,把主程序的后缀改成其它类型,比如你的主程序为Main.EXE ,你可以改成Main.CPU或者Main.DDD(扩展名自己随便取),然后做个Update.EXE文件,这个程序主要用来检测更新的,也是整个应用的入口程序。有更新了,下载完成并替换所有数据后,直接shellExecu这个Main.CPU或main.ddd(你自己定义的主程序,一般加载程序不需要扩展名,加载过程是靠文件的头信息来判断是否是可执行文件),加载后便退出Update(Main.EXE)文件,把控制权交给真正的可执行主体来执行。这样做的好处是对外隐藏了真正的程序主体,而且可以灵活地执行更新
参考技术A 你的主程序是AAA.EXE,你需要另一个UPDATE.EXE,当你的主程序检测到需要更新的时候,调用UPDATE.EXE,关闭AAA.EXE,下载新的AAA.EXE,覆盖,然后用UPDATE.EXE调用AAA.EXE,然后自己关闭掉UPDATE.EXE。追问

那请问aaa.exe中用什么命令可以启动update.exe,然后关闭aaa。exe啊

追答

WinExec是调用外部EXE的,关闭可以由程序自己发起,也可以从A发送一个自定义的消息到程序B的主窗口去通知后者关闭。

追问

想问仔细一点,能否详细点写明调用外部exe和关闭自身程序的代码,就两行代码
实在是麻烦了,一定给你分,谢谢

本回答被提问者采纳
参考技术B delphi 有个特点,主程序在运行时不能被覆盖,但可以改名,你可以先校验下载的程序是否可用,可用后把正在运行的主程序改名,再把下载的程序改名为原主程序的名字,退出重进就可以

以上是关于delphi 自动更新cs客户端的问题的主要内容,如果未能解决你的问题,请参考以下文章

kbmmw 中实现客户端自动更新

DELPHI有自动更新程序怎么破求教

svn服务器端的客户端自动更新

delphi 自动刷新

Delphi 求高手帮忙写自动更新程序

Delphi 的最佳自动更新组件