在WIN程序实现中止DOS程序(100分)

  • 主题发起人 主题发起人 bingLi
  • 开始时间 开始时间
B

bingLi

Unregistered / Unconfirmed
GUEST, unregistred user!
<br>&nbsp; &nbsp; 要在程序中调用一DOS下应用程序,讨厌的是该程序需手工用ESC或<br>CTRL+C强行中止,不得其法.<br>&nbsp; &nbsp; 试用老套路winexec(pchar('list.exe'),SW_SHOWNORMA),但无法在<br>程序中中实现中止;<br>&nbsp; &nbsp; 后用sw_hide参数,发现未出现DOS框,且程序正常执行<br>&nbsp; &nbsp; 初看乍好,但多运行两次,发现系统奇慢,察资源一看,发现运行了多<br>个WINOLDAP,还有多个系统内建的勾子程序运行,显然资源未释放.<br>&nbsp; &nbsp; 问各大侠,如能采用第二方式,该如何杀死该进程,以释放.<br>&nbsp; &nbsp; 如用WinExecAndWait32中止一DOS,又是如何实现的.<br>&nbsp; &nbsp; 两问均出实例,谢谢!<br>&nbsp; &nbsp; (不要太多水)
 
msdos程序在窗口中运行,也应有handle,找出它,kill!
 
假设该DOS程序是DIR,我仅一运行就中止它,该如何实现呢,请详细些,谢谢。。。。
 
程序是你创建的,该用createprocess试试.
 
查了一下旧贴,Kill Night指出createprocess后waitforsingleobject可解决问题,此函有<br>phnd, infinite两参,对吗?<br>如用infinite无限等待可以运行(仍达不到我的要求),但第一个参为啥不行。<br>各位帮忙,谢谢了。。
 
好像在win98中的对应MSDOS方式有一个名为WIN0A386.MOD的进程名,查出此进程名对应的进<br>程ID,然后用TerminateProcess将此进程KILL就可以了,应该不会有什么问题!
 
把问题总结一下:<br>&nbsp; &nbsp; 要求:需运行一DOS程序,对该DOS程序有绝对的控制能力,即能挂起和杀死,且DOS<br>程序不得在窗口内运行.<br>&nbsp; &nbsp; 已知:试过WINEXEC及CreateProcess,用参sw_hide均不能实现要求.<br>&nbsp; &nbsp; 我已近乎翻过所有类似的帖,如指定PIF,waitforsingleobject均不能如愿.<br>各大侠,难道此题无解么?! 不可能呀!各位侠士,为了咱大富翁的名誉也不能丢这个脸呀...<br><br>
 
不要继续使用 WinExec 了,改用 CreateProcess,使用其返回<br>PROCESS_INFORMATION 的 hProcess &amp; hThread 句柄完全可以<br>对子进程进行控制。使用 CreateProcess 的STARTUPINFO 参数,<br>可以对子进程的行为进行控制。<br><br>详细信息参考 MSDN.
 
没MSDN,请举出DOS下的一个杀死的实例好吗!<br>
 
终止Command.Com?
 
以下代码实现挂起等待:<br>void __fastcall TForm1::Button1Click(TObject *Sender)<br>{<br>&nbsp;STARTUPINFO si;<br>&nbsp; &nbsp; &nbsp; &nbsp; PROCESS_INFORMATION pi;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; si.cb = sizeof(STARTUPINFO);<br>&nbsp; &nbsp; &nbsp; &nbsp; si.dwFlags = STARTF_USESHOWWINDOW;<br>&nbsp; &nbsp; &nbsp; &nbsp; si.wShowWindow = &nbsp;SW_SHOWDEFAULT;<br><br>&nbsp; &nbsp; &nbsp; &nbsp; if(CreateProcess("c://windows//notepad.exe",<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NULL,NULL,NULL,FALSE,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CREATE_DEFAULT_ERROR_MODE,NULL,NULL,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&amp;si,&amp;pi))<br>&nbsp; &nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WaitForSingleObject((HANDLE)pi.hProcess,INFINITE);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowMessage("Success");<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; &nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowMessage("Failure");<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br><br>}<br>终止用TerminateProcess方法同上,最重要的是用CreateProcess获得process的handle<br>拿分来吧!!!
 
bingLi:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。<br><br>
 
回wangxd:我的要求可不是挂起或等待,是在它正常RUN时就KILL了它,要不留痕迹的。
 
不是说了吗,终止用TerminateProcess方法同上,最重要的是用CreateProcess获得process的handle<br>
 
尽管并不完整,但仍十分感谢wangxd给出示例!<br>为避免其它朋友遇到同样问题,我贴上完整的.<br>这里为每位朋友送分了.<br>procedure TForm1.setchannel;<br>var<br>&nbsp; CP: boolean;<br>&nbsp; si: TStartupInfo;<br>&nbsp; pi: TProcessInformation;<br>begin<br>&nbsp; FillChar(si, Sizeof(si), #0);<br>&nbsp; si.cb := Sizeof(si);<br>&nbsp; si.dwFlags := STARTF_USESHOWWINDOW;<br>&nbsp; si.wShowWindow := SW_hide;<br>&nbsp; cp := CreateProcess(nil, 'e:/ywcard/rece.exe 688.0',<br>&nbsp; &nbsp; &nbsp; &nbsp; nil, nil, True, NORMAL_PRIORITY_CLASS,<br>&nbsp; &nbsp; &nbsp; &nbsp; nil, nil, si, pi);<br>&nbsp; if cp then<br>&nbsp; begin<br>&nbsp; &nbsp;sleep(2000);<br>&nbsp; &nbsp;TerminateProcess(pi.hProcess,INFINITE);<br>&nbsp; end;<br>end;
 
多人接受答案了。
 
后退
顶部