运行外部程序并等待外部程序结束才返回结果的函数在下面
function WinExecAndWait32(FileName: string; Visibility: Boolean): integer;
var
  zAppName: array[0..512] of char; //存放应用程序名
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  exitCode: Dword;
  aVisibility: integer;
begin      
  StrPCopy(zAppName, FileName);       
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);       
  //给StartupInfo结构体赋值
  StartupInfo.cb := Sizeof(StartupInfo);       
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;       
  if Visibility then      
    aVisibility := 1
  else      
    aVisibility := 0;  StartupInfo.wShowWindow := aVisibility;
  //调用CreateProcess 创建进程,执行指定的可执行文件
  if not CreateProcess(nil, zAppName, nil, nil, false
    , CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS
    , nil, nil, StartupInfo, ProcessInfo) then
    Result := -1
  else
  begin
    //等待可执行文件退出
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    //得到进程终止状态码
    GetExitCodeProcess (ProcessInfo.hProcess, exitCode);
    result := exitCode;
  end;
end;如何修改一下变成我需要的功能,很多人说修改为WaitForInputIdle
但是我真的一点都不懂啊

解决方案 »

  1.   

    http://topic.csdn.net/t/20030218/13/1439470.html看下这个帖子吧,我和这个发帖人遇到的是同样的问题。
      

  2.   


    那直接winexec(...)就可以了吧
      

  3.   

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    WaitForInputIdle(ProcessInfo.hProcess, INFINITE);第2个参数可以是时间,单位是毫秒;
    如果都是用具体的时间,没啥区别,都是在等待指定的时间,时间到就返回,不管被启动的程序是否启动成功若是INFINITE,即永远等待下去,不受时间限制(取决于被启动程序执行的时间)
    区别在于前者要等到程序完全执行结束才返回,即从create到close
    而后者是,create完毕就返回,所以你的程序可以用WaitForInputIdle这个函数
      

  4.   

    可以循环监测主窗口是否找到!while FindWIndow(类名, 标题) = 0 do
    begin
      Application.ProcessMessages;
      Sleep(100)
    end
      

  5.   

    WaitForInputIdle 好像不起作用,进程的主窗口还没创建就执行过了,导致取不到进程窗口句柄,无从操作
      

  6.   

    菜鸟飘过,不明白外部程序不关闭的情况下,怎么会有ExitCode返回?