我用的是ShellExecute,exe程序中有return值,但是怎么得到?还有,调用是两个线程一起跑,我怎么才知道exe已经运行结束了?请指教,多谢!

解决方案 »

  1.   

    你可以用这段函数运行exe,并且可以等待结束
    function RunExeFile(const Prog, CommandLine, Dir: string; var ExitCode: DWORD):
      string;  procedure CheckResult(b: Boolean);
      begin
        if not b then
          raise Exception.Create(SysErrorMessage(GetLastError));
      end;
    var
      HRead, HWrite     : THandle;
      StartInfo         : TStartupInfo;
      ProceInfo         : TProcessInformation;
      b                 : Boolean;
      sa                : TSecurityAttributes;
    begin
      Result := '';
      FillChar(sa, sizeof(sa), 0);
      //设置允许继承,否则在NT和2000下无法取得输出结果
      sa.nLength := sizeof(sa);
      sa.bInheritHandle := True;
      sa.lpSecurityDescriptor := nil;
      b := CreatePipe(HRead, HWrite, @sa, 0);
      CheckResult(b);  FillChar(StartInfo, SizeOf(StartInfo), 0);
      StartInfo.cb := SizeOf(StartInfo);
      StartInfo.wShowWindow := SW_SHOW;
      //使用指定的句柄作为标准输入输出的文件句柄,使用指定的显示方式
      StartInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
      StartInfo.hStdError := HWrite;
      StartInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE); //HRead;
      StartInfo.hStdOutput := HWrite;  b := CreateProcess(PChar(Prog),       //lpApplicationName: PChar
        PChar(CommandLine),                 //lpCommandLine: PChar
        nil, //lpProcessAttributes: PSecurityAttributes
        nil,                                //lpThreadAttributes: PSecurityAttributes
        True,                               //bInheritHandles: BOOL
        CREATE_NEW_CONSOLE,
        nil,
        PChar(Dir),
        StartInfo,
        ProceInfo);  CheckResult(b);
      WaitForSingleObject(ProceInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProceInfo.hProcess, ExitCode);
    end;
      

  2.   

    ///执行一个外部程序,并且等待他的结束
    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,nil,StartupInfo,ProcessInfo) then
       result:=0
     else
     begin
       waitforsingleobject(processinfo.hProcess,INFINITE);
       GetExitCodeProcess(ProcessInfo.hProcess,Result);
     end;
    end;
      

  3.   

    多谢楼上二位!只是问题还没有解决:(我要调用的exe是有参数的,如果不用shellexecute该把参数写在什么位置呢?
      

  4.   

    问题还没解决,到底在哪里写exe需要的参数?我查过帮助,CreateProcess没有写参数的地方啊,老大们,帮帮忙吧!