一个比较弱的问题,用自身程序去运行令一个程序,让令一个程序把自己替换,可能吗?如何做?(50分)

  • 主题发起人 主题发起人 m911
  • 开始时间 开始时间
M

m911

Unregistered / Unconfirmed
GUEST, unregistred user!
用自身程序去运行令一个程序,让令一个程序把自己替换,可能吗?如何做?<br>例如 写一个程序A,和B,运行A后,A会自动运行程序B,程序B将程序A结束并替换掉,最后 原有的程序A消失 程序B替换成程序A并正常运行。不知道这种运行方法可能吗? 我自己写的总是会出错! 高手指点 &nbsp;最好有范例
 
自己写一个程序A,把要替换的程序B进程结束调然后更新掉,最后程序A调用更新后的B,A再关闭。调用几个API就可以了,网上的例子应该蛮多的。
 
不算是什么问题~
 
jacket84, 这位兄弟基本等于没回答,我要是能查到资料 或者能知道具体方法还能来这提问吗?
 
查找进程、结束进程、调用exe的函数你知道吗?呵呵
 
function TFrmImportExcel.FindProcess(AFileName: string): boolean;<br>var<br>hSnapshot: THandle;//用于获得进程列表<br>lppe: TProcessEntry32;//用于查找进程<br>Found: Boolean;//用于判断进程遍历是否完成<br>KillHandle: THandle;//用于杀死进程<br>begin<br>Result :=False;<br>hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获得系统进程列表<br>lppe.dwSize := SizeOf(TProcessEntry32);//在调用Process32First API之前,需要初始化lppe记录的大小<br>Found := Process32First(hSnapshot, lppe);//将进程列表的第一个进程信息读入ppe记录中<br>while Found do<br>begin<br>&nbsp; &nbsp; if ((UpperCase(ExtractFileName(lppe.szExeFile))=UpperCase(AFileName)) or (UpperCase(lppe.szExeFile )=UpperCase(AFileName))) then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; {if MsShow('发现打开Excel,是否将其关闭?',2)=6 then<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; //由于我的操作系统是xp,所以在调用TerminateProcess API之前<br>&nbsp; &nbsp; &nbsp; //我必须先获得关闭进程的权限,如果操作系统是NT以下可以直接中止进程<br>&nbsp; &nbsp; &nbsp; KillHandle := OpenProcess(PROCESS_TERMINATE, False, lppe.th32ProcessID);<br>&nbsp; &nbsp; &nbsp; TerminateProcess(KillHandle, 0);//强制关闭进程<br>&nbsp; &nbsp; &nbsp; CloseHandle(KillHandle);<br>&nbsp; &nbsp; &nbsp; end;}<br>&nbsp; &nbsp; &nbsp; Result :=True;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; Found := Process32Next(hSnapshot, lppe);//将进程列表的下一个进程信息读入lppe记录中<br>end;<br>end;<br><br>procedure TFrmImportExcel.EndProcess(AFileName: string);<br>const<br>PROCESS_TERMINATE = $0001;<br>var<br>ContinueLoop: BOOL;<br>FSnapShotHandle: THandle;<br>FProcessEntry32: TProcessEntry32;<br>begin<br>FSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);<br>FProcessEntry32.dwSize := SizeOf(FProcessEntry32);<br>ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);<br>while integer(ContinueLoop) &lt;&gt; 0 do<br>begin<br>&nbsp; &nbsp; if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(AFileName)) or (UpperCase(FProcessEntry32.szExeFile )=UpperCase(AFileName))) then<br>&nbsp; &nbsp; TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);<br>&nbsp; &nbsp; ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);<br>end;<br>end;<br><br><br>//调用<br>if FindProcess('EXCEL.EXE') then<br>begin<br>&nbsp; &nbsp; if MsShow('检测到打开了Excel,是否让其关闭?',2)&lt;&gt;6 then Exit;<br>&nbsp; &nbsp; EndProcess('EXCEL.EXE');<br>end;
 
激将法激出了源码?<br>其实jacket84把关键点都说了,lz可以去研究研究而不是激将。
 
已经完成了,不给分吗
 
现在好多软件都有自动更新功能,
 
A运行B。<br>之后B结束A的进程,然后用复制文件的方式来替换。<br>替换后B运行替换的程序,在结束自己。
 
补充一下,把A和B做成一样的外表,别人看起来,以为是一个程序自已实现替换自已.<br>呵呵,这其实是个不错的方法.<br><br>对用户来说,其实并没有什么坏处.他们才不管呢.他们更关心的是程序的稳定性!
 
yong bat wenjian bijiao jiandan yixie
 
不激不舒服斯基。。哈哈
 
其实有些人不想想原理,就是想要代码,对这些人给他代码又何妨?谁知道下次碰到同样的问题还会不会?只是楼主不地道,贴都不结,惰性就是这样培养出来的
 
其实我感觉LZ的需求说的太复杂,其实无非就是个升级程序<br><br>我感觉有得这么麻烦,不如清楚点,最两个EXE,一个专做业务,另一个专门用于升级的UPDATE.EXE,这样条理清楚,处理也比较方便.我就有个程序这么搞的<br>黑猫白猫抓到老鼠就是好猫
 
用消息通讯就可以轻松搞定啊
 
xuosng的方法,安在用。用http,ftp都可以实现升级.
 
执行批处理文件
 
接受答案了.
 
后退
顶部