procedure TForm2.Button1Click(Sender: TObject);
var   
      S:TStartupInfo;   
      P:TProcessInformation;   
      Sec:TSecurityAttributes;   
      read,write:THandle;
      buffer:array[0..511]   of   char;
      byteread,aprun:DWORD;
      hs:THandleStream;
      sl:TStrings;
      ec:Cardinal;
  begin   
      Memo1.Lines.Clear;   
      Sec.nLength:=Sizeof(TSecurityAttributes);   
      Sec.bInheritHandle:=True;
      Sec.lpSecurityDescriptor:=nil;   
      if   not   CreatePipe(read,write,@Sec,0)   then
          raise   Exception.Create('create   pipe   failed');   
      FillChar(S,Sizeof(TStartupInfo),0);   
      S.cb:=Sizeof(TStartupInfo);   
      S.wShowWindow:=SW_HIDE;
      S.dwFlags:=STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW;
      S.hStdOutput:=write;
      S.hStdError:=write;
      if   not   CreateProcess(nil,Pchar(edit1.Text),nil,nil,True,NORMAL_PRIORITY_CLASS,nil,nil,S,P)   then
          Raise   Exception.Create('Create   Process   Failed');   
      repeat
          aprun:=WaitForSingleObject(P.hProcess,250);
          Application.ProcessMessages;
      until   aprun<>WAIT_TIMEOUT;
      hs:=THandleStream.Create(read);
      if hs.Size > 0 then                                    
      begin
        sl:=TStringList.Create;
        sl.LoadFromStream(hs);
        Memo1.Text:=sl.Text;
        sl.Free;
      end;
      hs.Free;
      Label1.Caption:='命令执行完毕。';   
      CloseHandle(P.hProcess);
      CloseHandle(P.hThread);
      CloseHandle(read);   
      CloseHandle(write);
  end;
问题是 如果运行netstat -an 命令(即 edit.text = 'netstat -an')时,WaitForSingleObject一直返回WAIT_TIMEOUT。用任务管理器查看netstat.exe没有退出。一直在运行。
经测试发现运行 netstat -b 或者 netstat -n 都正常,运行结果后,用任务管理器查看netstat.ext进程退出。只要加上-a参数,WaitForSingleObject就超时,netstat.exe没有退出。请高手或遇到类似情况的帮忙看看!谢谢

解决方案 »

  1.   

    把until  aprun <>WAIT_TIMEOUT;改为
    until  aprun <>WAIT_OBJECT_0;
      

  2.   


    改成 WAIT_OBJECT_0 可以解决我的问题。
    但是netstat -n 确无法正常运行。
    有什么其他方法能准确判断createprocess创建的进程执行完毕
      

  3.   

    判断createprocess创建的进程执行完毕,还是用GetExitCodeProcess吧
    把你的repeat循环换为下面的试试
          repeat
            GetExitCodeProcess(p.hProcess,   ExitCode);
              Application.ProcessMessages;
          until  ExitCode   <>   STILL_ACTIVE;
      

  4.   


    现在的问题不是在用什么方法判定进程执行完毕。我观察发现。
    如果执行netstat -n命令,则执行完成后用任务管理器查看,netstat.exe就退出; 
    但是只要加上-a,则创建的进程不会退出。一直在运行。 所以不管用什么方法判定进程执行完毕都会死在那里,因为进程不会退出,一直在运行。
      

  5.   

    我测试过你的代码,在我的电脑上没有问题(D7+Win2003),均可以正常退出.
      

  6.   


    这程序我在我同事的机器上有一次成功退出,接着再运行又不可以了
    但是在我机器上一直不能正常退出。
    我跟我同事机器都是xp。有点奇怪。问题已经解决。我已经换成用shellexecute执行bat实现了。
    谢谢各位!