/* 
 * 通过管道技术,将dir /?的帮助信息输入到MFC应用程序的一个CEdit控件中。
 * VC++6.0 + WinXP 通过 
 * 
 * detrox, 2003 
 */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); 
  } 

解决方案 »

  1.   

    编译过了var
      sa:SECURITY_ATTRIBUTES;
      hRead,hWrite:THandle;
      si:STARTUPINFO;
      pi:PROCESS_INFORMATION;
      bytesRead:DWORD;
      buffer:PChar;begin
      sa.nLength := sizeof(SECURITY_ATTRIBUTES);
      sa.lpSecurityDescriptor := Nil;
      sa.bInheritHandle := TRUE;
      if (not CreatePipe(hRead,hWrite,@sa,0) ) then
      begin
       ShowMessage('Error On CreatePipe()');
       exit;
      end;  si.cb := sizeof(STARTUPINFO);
      GetStartupInfo(si);
      si.hStdError := hWrite;
      si.hStdOutput := hWrite;
      si.wShowWindow := SW_HIDE;
      si.dwFlags := STARTF_USESHOWWINDOW;
      if ( not CreateProcess(nil,PChar('c:\\windows\\system32\\cmd.exe/c dir /?')
            ,nil,nil,true,0,nil,nil,si,pi)) then
      begin
        ShowMessage('Error on CreateProcess()');
        exit;
      end;
      CloseHandle(hWrite);  while (true) do
      begin
          if (ReadFile(hRead,buffer,4095,bytesRead,nil) = false) then
              break;
          m_Edit1.Text = m_Edit1.Text+buffer;
          Sleep(200);
      end;end;
      

  2.   

    请问在CreatePipe(&hRead,&hWrite,&sa,0))一句 为什么在DELPHI中要改为 CreatePipe(hRead,hWrite,@sa,0) 为什么不是CreatePipe(@hRead,@hWrite,@sa,0) @不是取指针所指向地址的值吗?
      

  3.   

    &在C中是取地址的运算符,而Delphi中类似的运算符是@
      

  4.   

    你还是看一下MSDN上CreatePipe的帮助吧,我一开始也是那么写CreatePipe(@hRead,@hWrite,@sa,0) 
    看了帮助后才那么改的
      

  5.   

    有几个地方要改以下
    buffer:PChar;
    改为
    buffer: array[1..4096] of char;si.dwFlags := STARTF_USESHOWWINDOW OR STARTF_USESTDHANDLES ;
      

  6.   

    楼上的错了,C/C++中数组都是从0开始计数的,为了统一应该这样声明Buffer
    var
      buffer :array [0..4095] of char;
      

  7.   

    我来给你解释为什么传递成hRead和hWrite
    因为Delphi中CreatePipe的原型是这样的CreatePipe(var hReadPipe, hWritePipe :THandle;
    后面照旧,就懒得写了)。
    这里的var代表是传址调用,如果你传入@hRead和@hWrite进去,那么你传入的就是hRead和hWrite的地址进去那么CreatePipe就无法修改地址的地址了