winexec()运行一段DOS程序,如何怎样让它执行完再继续往下执行?

解决方案 »

  1.   

    例如
    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);
      

  2.   

    如果运行一个程序之后等待程序运行结束后再进行其他工作,可以使用下面的代码: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;
      

  3.   

    CreateProcess的API才是好的解决方法
      

  4.   

    这个函数对你肯定有用,而且是比较科学的办法。用以下函数替换你的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;