如题

解决方案 »

  1.   

    在CreateProcess的时候可以把控制台程序的输出重定向.typedef struct _STARTUPINFO { 
        DWORD   cb; 
        LPTSTR  lpReserved; 
        LPTSTR  lpDesktop; 
        LPTSTR  lpTitle; 
        DWORD   dwX; 
        DWORD   dwY; 
        DWORD   dwXSize; 
        DWORD   dwYSize; 
        DWORD   dwXCountChars; 
        DWORD   dwYCountChars; 
        DWORD   dwFillAttribute; 
        DWORD   dwFlags; 
        WORD    wShowWindow; 
        WORD    cbReserved2; 
        LPBYTE  lpReserved2; 
        HANDLE  hStdInput; 
        HANDLE  hStdOutput; 
        HANDLE  hStdError; 
    } STARTUPINFO, *LPSTARTUPINFO; 
      

  2.   

    void CPipeDlg::OnButton1() 

      SECURITY_ATTRIBUTES sa;
      HANDLE hRead,hWrite;
            
      sa.nLength = sizeof(SECURITY_ATTRIBUTES);
      sa.lpSecurityDescriptor = NULL;
      sa.bInheritHandle = TRUE;
      if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
       MessageBox("Error On CreatePipe()");
         return;
      } 
      STARTUPINFO si;
      PROCESS_INFORMATION pi; 
      si.cb = sizeof(STARTUPINFO);
      GetStartupInfo(&si); 
      si.hStdError = hWrite;
      si.hStdOutput = hWrite;
      si.wShowWindow = SW_HIDE;
      si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
      if (!CreateProcess(NULL,"c:\\windows\\system32\\cmd.exe/c dir /?"
            ,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
            MessageBox("Error on CreateProcess()");
            return;
      }
      CloseHandle(hWrite);
            
      char buffer[4096] = {0};
      DWORD bytesRead; 
      while (true) {
          if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
              break;
          m_Edit1 += buffer;
          UpdateData(false);
          Sleep(200); 
      } 
    }
      

  3.   

    var
    hReadPipe,hWritePipe:THandle;
    si:STARTUPINFO;
    lsa:SECURITY_ATTRIBUTES;
    pi:PROCESS_INFORMATION;
    mDosScreen:String;
    cchReadBuffer:DWORD;
    ph:PChar;
    fname:PChar;
    i,j:integer;
    begin
    fname:=allocmem(255);
    ph:=AllocMem(5000);
    lsa.nLength :=sizeof(SECURITY_ATTRIBUTES);
    lsa.lpSecurityDescriptor :=nil;
    lsa.bInheritHandle :=True; if CreatePipe(hReadPipe,hWritePipe,@lsa,0)=false then
    begin
    ShowMessage('Can not create pipe!');
    exit;
    end;
    fillchar(si,sizeof(STARTUPINFO),0);
    si.cb :=sizeof(STARTUPINFO);
    si.dwFlags :=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);
    si.wShowWindow :=SW_HIDE;
    si.hStdOutput :=hWritePipe;
    StrPCopy(fname,EditFilename.text);
                        //edit 中输入你的命令, 如CMD.EXE /c dir/w if CreateProcess( nil, fname, nil, nil, true, 0, nil, nil, si, pi) = False then
    begin
    ShowMessage('can not create process');
    FreeMem(ph);
    FreeMem(fname);
    Exit;
    end; while(true) do
    begin
    if not PeekNamedPipe(hReadPipe,ph,1,@cchReadBuffer,nil,nil) then break;
    if cchReadBuffer<>0 then
    begin
    if ReadFile(hReadPipe,ph^,4096,cchReadBuffer,nil)=false then break;
    ph[cchReadbuffer]:=chr(0);
                                    Memo1.Lines.Add(ph);
    end
    else if(WaitForSingleObject(pi.hProcess ,0)=WAIT_OBJECT_0) then break;
    Sleep(100);
    end; ph[cchReadBuffer]:=chr(0);
               Memo1.Lines.Add(ph);  //memo接收返回
    CloseHandle(hReadPipe);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(hWritePipe);
    FreeMem(ph);
    FreeMem(fname);
    end;
      

  4.   

    http://expert.csdn.net/Expert/topic/2640/2640675.xml?temp=.3809015