希望有大虾可以解决ShellExecute调用DOS命令后的CMD进程 ( 积分: 50 )

  • 主题发起人 主题发起人 aaee_1980
  • 开始时间 开始时间
A

aaee_1980

Unregistered / Unconfirmed
GUEST, unregistred user!
各位论坛上的朋友,想请教一下,小弟在DELPHI里面调用以下命令<br>&nbsp;ShellExecute(Handle,&nbsp;nil,&nbsp;'cmd.exe',&nbsp;pchar('/K&nbsp;&nbsp;md&nbsp;c:/目录'),&nbsp;nil,&nbsp;SW_HIDE);<br>但发现在调用完成后会在进程里面多出一个cmd.exe,假如我要连接执行一千条以上的shellExecute命令,那么就不可能实现了,有没有办法,可以在每调用一条ShellExecute调命令之后,就终止一个CMD进程呢?<br><br>我试过用以下的过程,在每执行一次<br>ShellExecute(Handle,&nbsp;nil,&nbsp;'cmd.exe',&nbsp;pchar('/K&nbsp;&nbsp;md&nbsp;c:/目录'),&nbsp;nil,&nbsp;SW_HIDE);<br>然后就&nbsp;KillProc('cmd.exe'),但发现程序就不能正常进行调用了,不知道为什么?<br>希望有大虾能帮忙解决,每ShellExecute一次之后,就可以立即出现的CMD.exe,然后让其继续执行下一次的ShellExecute,这样不断循环,直到ShellExecute不再执行为止。<br><br>衷心谢谢!!!<br><br><br><br>procedure&nbsp;TForm1.KillProc(procname:&nbsp;string);&nbsp;//终止指定的进程<br>const<br>&nbsp;&nbsp;PROCESS_TERMINATE&nbsp;=&nbsp;$0001;<br>var<br>&nbsp;&nbsp;ExeFileName:&nbsp;string;<br>&nbsp;&nbsp;ContinueLoop:&nbsp;BOOL;<br>&nbsp;&nbsp;FSnapshotHandle:&nbsp;THandle;<br>&nbsp;&nbsp;FProcessEntry32:&nbsp;TProcessEntry32;&nbsp;//注意:TProcessEntry32必须引用单元TlHelp32<br>begin<br>&nbsp;&nbsp;ExeFileName&nbsp;:=&nbsp;procname;<br>&nbsp;&nbsp;FSnapshotHandle&nbsp;:=&nbsp;CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,&nbsp;0);<br>&nbsp;&nbsp;FProcessEntry32.dwSize&nbsp;:=&nbsp;Sizeof(FProcessEntry32);<br>&nbsp;&nbsp;ContinueLoop&nbsp;:=&nbsp;Process32First(FSnapshotHandle,&nbsp;FProcessEntry32);<br>&nbsp;&nbsp;while&nbsp;integer(ContinueLoop)&nbsp;&lt;&gt;&nbsp;0&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))&nbsp;=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpperCase(ExeFileName))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;(UpperCase(FProcessEntry32.szExeFile)&nbsp;=<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpperCase(ExeFileName)))&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TerminateProcess(OpenProcess(PROCESS_TERMINATE,&nbsp;BOOL(0),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FProcessEntry32.th32ProcessID),&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ContinueLoop&nbsp;:=&nbsp;Process32Next(FSnapshotHandle,&nbsp;FProcessEntry32);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;
 
试试用这个来执行<br>function&nbsp;TForm1.WinExecAndWait32(FName:String;Visibility:Integer):Cardinal;<br>var<br>&nbsp;&nbsp;WorkDir:PChar;<br>&nbsp;&nbsp;StartupInfo:TStartupInfo;<br>&nbsp;&nbsp;ProcessInfo:TProcessInformation;<br>begin<br>&nbsp;&nbsp;WorkDir:=PChar(ExtractFileDir(ParamStr(0)));<br>&nbsp;&nbsp;FillChar(StartupInfo,Sizeof(StartupInfo),#0);<br>&nbsp;&nbsp;StartupInfo.cb:=Sizeof(StartupInfo);<br>&nbsp;&nbsp;StartupInfo.dwFlags:=STARTF_USESHOWWINDOW;<br>&nbsp;&nbsp;StartupInfo.wShowWindow:=Visibility;<br>&nbsp;&nbsp;if&nbsp;not&nbsp;CreateProcess(nil,<br>&nbsp;&nbsp;&nbsp;&nbsp;PChar(FName),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;pointer&nbsp;to&nbsp;command&nbsp;line&nbsp;string&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;nil,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;pointer&nbsp;to&nbsp;process&nbsp;security&nbsp;attributes&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;nil,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;pointer&nbsp;to&nbsp;thread&nbsp;security&nbsp;attributes&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;True,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;handle&nbsp;inheritance&nbsp;flag&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;CREATE_NEW_CONSOLE&nbsp;or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;creation&nbsp;flags&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;NORMAL_PRIORITY_CLASS,<br>&nbsp;&nbsp;&nbsp;&nbsp;nil,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;pointer&nbsp;to&nbsp;new&nbsp;environment&nbsp;block&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;WorkDir,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;pointer&nbsp;to&nbsp;current&nbsp;directory&nbsp;name,&nbsp;PChar}<br>&nbsp;&nbsp;&nbsp;&nbsp;StartupInfo,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;pointer&nbsp;to&nbsp;STARTUPINFO&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;ProcessInfo)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;pointer&nbsp;to&nbsp;PROCESS_INF&nbsp;}<br>&nbsp;&nbsp;then&nbsp;Result:=INFINITE&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Application.ProcessMessages;<br>&nbsp;&nbsp;&nbsp;&nbsp;WaitforSingleObject(ProcessInfo.hProcess,&nbsp;INFINITE);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetExitCodeProcess(ProcessInfo.hProcess,&nbsp;Result);<br>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ProcessInfo.hProcess);&nbsp;&nbsp;{&nbsp;to&nbsp;prevent&nbsp;memory&nbsp;leaks&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ProcessInfo.hThread);<br>&nbsp;&nbsp;end;<br>end;
 
多人接受答案了。
 
后退
顶部