我做了一个自动更新的程序:
原理是采用主程序和副程序:
主程序一打开自动上网查找是否有更新文件,有则自动下载到一个临时目录,下载完后,则结束主进程,并调用副程序。副程序一打开则自动复制临时目录内文件到主程序目录,覆盖后并重新启动主程序,再结束自身进程。现在就问题是:主程序调用副程序后还没有关闭自己,还挂着自己在内存,使得副程序无法执行覆盖操作。求高手指点下:
主程序的调用那段代码的应该怎样写?才能让主程序完全关闭,同时能启去副程序去执行覆盖操作?
代码:
主程序:
procedure TSS002_WebUpdate.BtnUpdateClick(Sender: TObject);
begin
//...检查更新,并下载
//主程序和副程序在同一目录
...
application.Terminate;
ShellExecute(0,pchar('OPEN'),Pchar('副程序'), nil, nil, SW_SHOWNORMAL);
end;副程序:
procedure TFrm_Main.FormShow(Sender: TObject);
begin
//利用 ShFileOperation(v_SHFOS) 进行复制目录
//复制完后启动主程序
shellexecute(0, 'open', pchar('主程序'), nil, nil, sw_shownormal) ;
close;
end;
原理是采用主程序和副程序:
主程序一打开自动上网查找是否有更新文件,有则自动下载到一个临时目录,下载完后,则结束主进程,并调用副程序。副程序一打开则自动复制临时目录内文件到主程序目录,覆盖后并重新启动主程序,再结束自身进程。现在就问题是:主程序调用副程序后还没有关闭自己,还挂着自己在内存,使得副程序无法执行覆盖操作。求高手指点下:
主程序的调用那段代码的应该怎样写?才能让主程序完全关闭,同时能启去副程序去执行覆盖操作?
代码:
主程序:
procedure TSS002_WebUpdate.BtnUpdateClick(Sender: TObject);
begin
//...检查更新,并下载
//主程序和副程序在同一目录
...
application.Terminate;
ShellExecute(0,pchar('OPEN'),Pchar('副程序'), nil, nil, SW_SHOWNORMAL);
end;副程序:
procedure TFrm_Main.FormShow(Sender: TObject);
begin
//利用 ShFileOperation(v_SHFOS) 进行复制目录
//复制完后启动主程序
shellexecute(0, 'open', pchar('主程序'), nil, nil, sw_shownormal) ;
close;
end;
下载放到升级程序, 下载完,然后MoveFileEx, 将俩程序对换,然后主程序退出,启动主程序,就完成升级了
我没未用过movefileex,不过查了一下说明,貌似是将整个目录移动过去。这样做会有一个问题,原目录下不需要更新的文件同样会一命呜呼,不可取啊。例如自定义的INI文件gyk120说的方法和我的一样,只是我不知道,怎样完全结束主程序,并能启动副程序?因为我上面写的代码有问题,主程序还没有释放,所以副程序进行覆盖时,系统提示主程序正在被使用的错误,若有解决方法请解救下。
movefileex 这个不太会用,若要重启电脑就太大工程了。如下大富翁的某个例子:都是要启电脑的:
MoveFileEx('C:\aa.exe, nil, MOVEFILE_REPLACE_EXISTING or MOVEFILE_DELAY_UNTIL_REBOOT)
curver=1.0.2就不用更新,调用的很快就退出执行,启动主程序启动后,有线程来进行连网看是否有更新,当有时,下载完后就再配置,就成update=1.0.3
curver=1.0.2...updatedir= 20100601
...一不同,下次启动就更新呗
简单一点就分两个文件
你可以用TerminateProcess结束主程序进程,然后MoveFile直接替换
最低可用版本=3.01
最新版本=5.12程序xxx.exe每次运行先下载这个ini
如果自己低于3.01的,则必须升级
如果自己低于5.12的,则仅仅提示是否升级下载新版本,是一个独立的au.exe,接受程序xxx.exe的命令行参数来调用,程序xxx.exe自己随即退出
au.exe去下载xxx.5.12,下载成功等n秒钟(也是命令行指定的),再把把xxx.exe改名为xxx.5.10(也是命令行指定的),把xxx.5.12改为xxx.exe
2、更新程序启动后下载更新,用定时器反复检查主程序是否已退出(可通过Windows的“互斥体对象(mutex object)”,搜索OpenMutex、ReleaseMutex、WaitForSingleObject)
3、确定主程序关闭后,将主程序改名备份,再将下载后的文件放改为主程序名
用CreateProcess调用副程序就好了