winexec()运行一段DOS程序,如何怎样让它执行完再继续往下执行? winexec()运行一段DOS程序,如何怎样让它执行完再继续往下执行? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 例如var st:TStringList;st:=TStringList.Create;st.Add('xxxxx.exe');st.Add('yyyyy.exe');st.SaveToFile('zzz.bat');st.Free;WinExec('zzz.bat',SW_HIDE);这个会导致xxxxx.exe还没退出就执行yyyyy.exe,解决的方法实在前面加上start /w 让start程序来启动并等待进程结束:var st:TStringList;st:=TStringList.Create;st.Add('start /w xxxxx.exe');st.Add('start /w yyyyy.exe');st.SaveToFile('zzz.bat');st.Free;WinExec('zzz.bat',SW_HIDE); 如果运行一个程序之后等待程序运行结束后再进行其他工作,可以使用下面的代码:varsCommandLine: string;bCreateProcess: boolean;lpStartupInfo: TStartupInfo;lpProcessInformation: TProcessInformation;beginbCreateProcess := CreateProcessA(nil, 'Notepad',nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil,lpStartupInfo, lpProcessInformation);if bCreateProcess thenWaitForSingleObject(lpProcessInformation.hProcess, INFINITE);end; CreateProcess的API才是好的解决方法 这个函数对你肯定有用,而且是比较科学的办法。用以下函数替换你的Winexec,这个函数的目的就是等待被执行的内容,直到它执行完成才退出。Function WinExecExW(CMD,WorkDir : Pchar; Visiable : integer) : DWORD;var StartupInfo : TStartupInfo; ProcessInfo : TProcessInformation;begin FillChar(StartupInfo,SizeOf(StartupInfo),#0); StartupInfo.cb := SizeOf(StartupInfo); StartupInfo.dwFlags := STARTF_USESHOWWINDOW; StartupInfo.wShowWindow := Visiable; if not CreateProcess(nil, cmd, nil, nil, false, Create_new_console or Normal_priority_class, nil, WorkDir, StartupInfo, ProcessInfo) then result:=0 else begin WaitForSingleObject(Processinfo.hProcess,INFINITE); GetExitCodeProcess(ProcessInfo.hProcess,Result); end;end; 请教大家,如何等待一个第三方的多线程类执行完毕? 控件制作工具 Delphi是不是一种语言 如何求得当前天为该年中的第几周,该周中第几天? 一段代码,帮我看看.谢谢各位,在线等,急 怎样改变dbgrideh某一个单元格的字体颜色? 关于动态数组问题 DELPHI的图片资源转换~ 我刚刚完成一个软件,想放到csdn的软件下载中!但我没找到怎么上传上去! 怎么用Filter查询记录呢?(比如查询一个text字段的记录里是否包含"SSS") 游戏“连连看”的算法! 一个表关联的小问题!
var st:TStringList;
st:=TStringList.Create;
st.Add('xxxxx.exe');
st.Add('yyyyy.exe');
st.SaveToFile('zzz.bat');
st.Free;
WinExec('zzz.bat',SW_HIDE);这个会导致xxxxx.exe还没退出就执行yyyyy.exe,解决的方法实在前面加上start /w 让start程序来启动并等待进程结束:var st:TStringList;
st:=TStringList.Create;
st.Add('start /w xxxxx.exe');
st.Add('start /w yyyyy.exe');
st.SaveToFile('zzz.bat');
st.Free;
WinExec('zzz.bat',SW_HIDE);
Function WinExecExW(CMD,WorkDir : Pchar; Visiable : integer) : DWORD;
var
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
begin
FillChar(StartupInfo,SizeOf(StartupInfo),#0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visiable;
if not CreateProcess(nil,
cmd,
nil,
nil,
false,
Create_new_console or Normal_priority_class,
nil,
WorkDir,
StartupInfo,
ProcessInfo) then
result:=0
else
begin
WaitForSingleObject(Processinfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Result);
end;
end;