怎么回事啊连问了几个问题,.连睬都没人睬,DFW落魄啦?? --关于自己移动自己(movefile in 98) (50分)

  • 主题发起人 主题发起人 forss
  • 开始时间 开始时间
F

forss

Unregistered / Unconfirmed
GUEST, unregistred user!
我的软件里用到了在线更新,其中用到了MOVEFILE,自己MOVE自己,更新后不用重新启动,<br>这个API在2000下正常使用,虽然会有WIN32ERROR,但不妨碍使用,可以MOVE成功<br>可是在98下就不行了,无法自己MOVE自己,WIN32 ERROR CODE=5,报无法访问,<br>谁有处理过这样情况的啊? <br><br>我离线数据查过了,没有结果.MSDN里也没有讲自己MOVE自己的情况.以前DFW里有个<br>TAUTOUPDATE是要重启才更新的.不好.<br><br>
 
98 move self 你必须使用 wininit.ini ,想不重启也可以,复制自己,<br>关闭自己,关闭前启动复制品,复制品可以使用参数启动,也可以更名启动,自己检查<br>参数或文件名,发现是复制品,即删除原文件,执行更新,然后就有很多办法删除复制<br>品。这样做的效果就是不启动立即可以投入使用了。
 
没有办法直接使用MOVEFILE涵数么? 为什么我有的时候在98下可以直接MOVEFILE SELF??<br><br>确切情况,有的情况下可以自动升级成功,所以我晕了...:(
 
任何被加载的程序,系统都会在缓冲区登记并 Lock 它。MoveFile 没有什么特殊的,<br>它就是一个删除文件的函数,你要删除文件,尤其是 EXE,DLL ,你都需要从内存中卸<br>载它,使系统不再 Lock 住它。
 
哦..那为什么2000和XP下都可以呢?虽然也报出错了.<br><br>PS:如何从内存中卸载我的程序,而又不关闭我的程序呢??给点提示黑黑..
 
我也正在研究这个问题。但恐怕自己智力不够。因为你的说法是很多专家不肯透露的,<br>既然要运行,肯定必须让程序装入内存。至于使用文件映射,载入内存后改变注册名称,<br>清除 atom 原例,我就没这个能力了,你可以试试。
 
//确切情况,有的情况下可以自动升级成功,所以我晕了...:(<br>我想问题在于[red]目标文件[/red]已经存在了?我在2k下试过了,如果目标文件存在<br>MoveFile是失效的。<br>2K下,可能系统已经帮你屏蔽了Error,而98没有,所以你有时ok,有时No.<br>即然这样,就用CopyFile,把bFailIfExists 设为FALSE试试<br><br>for:最近好吗?Oracle很熟了吧,我又好多问题要问你哦[:D]<br>&nbsp; &nbsp;<br><br>&nbsp;<br>
 
kevincsg:<br>&nbsp;COPYFILE的方法更不行了.昨晚我试了一个晚上想把程序从内存中去掉又不结束他,<br>没成功,在98下想把进程调入RING0级,蓝屏了N次,也没成功,,:(<br>期待高手中...........<br><br>:) 我现在ORACLE不熟啦..现在我搞的还是前台的东西.I LOVE DELPHI..:)
 
程序不从内存 Move 掉而删除程序的问题,你自己慢慢试验. &nbsp; :-)<br>
 
嘿嘿,你的代码我试过了,会自己把自己关掉啦。更不能执行下面的东西啦。。<br><br>还是用最找CAKK的方法了。写个BAT,来做以后的事情,DEL SELF &amp; NAME &nbsp;EXE
 
哈哈哈, forss ,你不是耍我吧,我给你的部分缺少再次启动的代码,应为我觉得你的<br>启动和再次初始化或许和我的不一样,所以删掉了这部分,主要的进程处理是你的问题的<br>核心。在给代码前,我还特意查看了你曾经提出过的问题,觉得值得用具体代码来回答你,<br>你不应该是囫囵吞枣的水平啊? :-)
 
:)<br>ProcessExit := TerminateProcess(ProcessWnd, 0);<br>这句就直接把自己的程序给CUT掉了吧。<br><br>我想你和我所用的方法是不一样的吧,<br>你是安装文件哦。<br>CopyFile(PChar(SFName), PChar(DFName), False);<br>而我是更新文件,而且你的方法在fbcolor.exe运行的时候是安装失败的吧。<br>试了很多次都没有达到从内存中MOVE而不关掉程序。看来还要继续研究一下。<br><br>因为急用,所以用了变通的方法。在nt,2k,xp下直接movefile,<br>在9x下:<br>下载更新版本文件-----删除自己-----将新版本文件命名为使用的文件名---<br>-启动temp.exe---在temp.exe中延迟(否则不能正常重新运行)---<br>---在temp.exe里重新运行新版本的程序,关闭temp.exe<br><br>可能麻烦了些。确实最简单省力的。:)
 
:)<br>我看了自己给你的代码,呵呵,删得快了点,有几个地方衔接上有误。<br>你自己不能改改的吗?就光顾着最好人家全给你写好代码了。呵呵。:-)
 
:) <br>你的代码不适合我啦。最上面那段就是CLOSE了。你是用在安装程序的地方,<br>是适合的呀。关闭指定程序,然后拷贝过去覆盖它。<br>但是无法movefile self的,我试了呀。还是我水平不够。请指教。<br>我的更新部分是exe程序自己更新自己的。
 
直接自己更新自己肯定不可以啦。<br>你可以退出后由其他程序做嘛!
 
知道了。我没理解。分分吧。
 
接受答案了.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
689
import
I
后退
顶部