程序在运行中,如何实现在线升级?

firefly3233 2012-02-08 03:45:59
如QQ游戏大厅。
运行后,弹出登录框,然后是自动升级,然后进入大厅。
1、程序运行,连到指定服务器。用socket
2、把本程序版本号发往服务器。用socket
3、服务器判断如果版本号低于某值,向客户端发升级命令。用socket
4、可程序运行了,EXE程序不能改呀。怎么进行的?
5、如何查找到升级的文件,是通过什么方式更新的?
...全文
331 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
firefly3233 2012-02-12
  • 打赏
  • 举报
回复
我暂时用得是:
EXE的InitInstance
运行update.dll得到下载的目录
如果目录数大于0,"rundll32.exe update.dll FTPDownloadFiles myappname",并返回FLASE,关闭了主程序.
在FTPDownloadFiles里下载目录中的文件后,启动myappname.

感觉还不错.只不过update.dll本身不好升级,因为升级代码在dll里.
WillyWonka 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 firefly3233 的回复:]
不想做成Update.exe,如果做成这,用户不懂,瞎点运行.
如果是Update.dll就好了.
[/Quote]
我见过有把子程序做成.ICO的我会说么..
许文君 2012-02-10
  • 打赏
  • 举报
回复
明白LZ的意思了,LZ想要的是程序自删除然后替换新版本是吧
LuciferStar 2012-02-10
  • 打赏
  • 举报
回复
升级程序负责下载,检验文件正确性,一切准备就绪后发送消息给正在运行的程序,通知有更新,需要关闭。
待程序关闭后,执行文件覆盖操作。
如果程序不在运行,直接覆盖。
WillyWonka 2012-02-10
  • 打赏
  • 举报
回复
楼主可以参考网狐游戏平台的代码..消息协议里添加VerMessage版本号,版本号不对就发送客户端Updata消息,然后客户端就可以根据服务器地址开启DOWNLOAD。不是太复杂
fly4free 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 firefly3233 的回复:]

不想做成Update.exe,如果做成这,用户不懂,瞎点运行.
如果是Update.dll就好了.
[/Quote]

点了就升级呗。
或者根据 IPC 只允许指定进程 启动它。
fly4free 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 firefly3233 的回复:]

引用 7 楼 oyljerry 的回复:
2、如果不相等:执行"rundll32 update.dll 升级函数名",并返回-1,这样就本程……
[/Quote]

第2条,虽然作为服务器端维护者,没人要把旧版本替换到 服务器端 但是误操作这个东西 不容忽视。
firefly3233 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oyljerry 的回复:]
由主程序启动的时候来调用升级程序,升级程序根本就没有任何UI。
[/Quote]
能不能这样?(程序目录下有一个update.dll)
1、程序运行,在CWinApp.InitInstance()里判断本程序版本和HTTP:\\xxx\需升级文件.exe的版本;
2、如果不相等:执行"rundll32 update.dll 升级函数名",并返回-1,这样就本程序就退出了。
3、update.dll的升级函数里:弹出个升级对话框,显示进度等,下载http:\\xxx\需升级文件.exe。,下载完成,替换本程序.exe(本程序已关闭,可以替换)。
4、重新运行本程序.exe,因为已经是最新版本,CWinApp.InitInstance()里判断本程序版本和HTTP:\\xxx\需升级文件.exe版本一致,跳过“rundll update.dll..."继续运行本程序。
firefly3233 2012-02-09
  • 打赏
  • 举报
回复
不想做成Update.exe,如果做成这,用户不懂,瞎点运行.
如果是Update.dll就好了.
oyljerry 2012-02-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 firefly3233 的回复:]
可一般,我们都是见到一个EXE呀.如果做成两个,用于没有按你规定的顺序:先点升级程序,再点主程序.
而是先点主程序,再点升级程序呢?
[/Quote]
由主程序启动的时候来调用升级程序,升级程序根本就没有任何UI。
ystemni 2012-02-09
  • 打赏
  • 举报
回复
1、主程序运行。启动升级线程。
2、线程可设置X秒后运行,访问远程服务器。
3、服务器返回软件最新的版本号,主程序判断与当前程序版本号是否一致。
4、不一致的话,提示是否升级最新版本。
5、确定升级的话,运行Update.exe(一般在主程序同路径下),下载完成后,运行Update.exe
6、Update.exe有无UI均可(我自己做的一个是有UI的,显示更新内容),关闭主程序,下载最新版本主程序文件为bak,然后你先DeleteFile再rename也好,直接MoveFile也好,随便你。
xiaohuh421 2012-02-09
  • 打赏
  • 举报
回复
首先,楼主要去看看现在游戏客户端的做法.
升级程序和游戏主程序及模块都是分开的.也就是说,升级程序运行时,并不会运行你的主程序.
firefly3233 2012-02-09
  • 打赏
  • 举报
回复
那还有别的方式吗?CSocketFile?用这种方式把需升级的文件传到客户端?
firefly3233 2012-02-08
  • 打赏
  • 举报
回复
可一般,我们都是见到一个EXE呀.如果做成两个,用于没有按你规定的顺序:先点升级程序,再点主程序.
而是先点主程序,再点升级程序呢?
hdg3707 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 firefly3233 的回复:]
MoveFile()修改xxx.exe.bak到xxx.exe;然后启动该xxx.exe.

这个工作由谁做?线程?如果是,也是本EXE开的线程,程序正在运行中,不能修改.BAK到...
[/Quote]
象1楼主说的,单独做个升级程序.由这个升级程序来做
firefly3233 2012-02-08
  • 打赏
  • 举报
回复
MoveFile()修改xxx.exe.bak到xxx.exe;然后启动该xxx.exe.

这个工作由谁做?线程?如果是,也是本EXE开的线程,程序正在运行中,不能修改.BAK到...
firefly3233 2012-02-08
  • 打赏
  • 举报
回复
用线程下载,用什么模式下载.总不是HTTP吧?
oyljerry 2012-02-08
  • 打赏
  • 举报
回复
1.可以退出运行的程序,然后覆盖,再启动
2.重启以后替换文件,等于是机器下次重启才真正更新,MoveFileEx()
Eleven 2012-02-08
  • 打赏
  • 举报
回复
单独做个升级程序,程序里开线程检测,如果需要升级,启动升级程序升级。升级程序开始下载数据保存到本地,比如xxx.exe.bak;然后询问用户是否升级该程序,如果升级,关闭原来的程序,然后MoveFile()修改xxx.exe.bak到xxx.exe;然后启动该xxx.exe.

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧