(不好意思,想要邀请码太激动了,贴发重了,请谅解)

匿名管道的应用:首先在主程序中以主程序的读、写句柄建立一个匿名管道,然后在主程序中建立一个命令行进程,把命令行进程的写句柄给主程序,最后通过主程序的一个多线程函数从匿名管道中取出数据显示在主程序中。这样可以得到一个简陋的cmd程序的窗口版本。


以主程序的读、写句柄建立一个匿名管道:
    SECURITY_ATTRIBUTES sa = {0} ;
  sa.bInheritHandle = TRUE ;
  sa.lpSecurityDescriptor = NULL ;
  sa.nLength = sizeof(SECURITY_ATTRIBUTES) ;

  if (!CreatePipe(&m_hRead, &m_hWrite, &sa, 0))
  {
    return ;
  }

建立一个命令行进程:
    PROCESS_INFORMATION pi = {0} ;
  STARTUPINFO si = {0} ;
  si.cb = sizeof(STARTUPINFO) ;
  si.dwFlags=STARTF_USESTDHANDLES|          STARTF_USESHOWWINDOW ;
  si.hStdError = si.hStdOutput = m_hWrite ;
  si.wShowWindow = SW_HIDE ;
  
  TCHAR szCmdLine[500] = {0} ;
  ZeroMemory(szCmdLine, 500) ;
  GetSystemDirectory(szCmdLine, 500) ;
  lstrcat(szCmdLine, TEXT("\\cmd.exe /c ")) ;
  lstrcat(szCmdLine, szCmdBuf) ;

  CloseHandle(m_PreProcHandle) ;
  TerminateProcess(m_PreProcHandle, 0) ;
  if(!CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
  {
    MessageBox(TEXT("创建进程失败!")) ;
  }

创建一个多线程函数从匿名管道中取出数据显示在主程序中
  m_ThreadHandle = CreateThread(NULL, 0, ShowCmdOutput, (LPVOID)pNode, 0, NULL) ;
do
  {
    bRet = PeekNamedPipe(hRead, NULL, 0, NULL, &dwTotalAvail, NULL) ;
    if (bRet && dwTotalAvail > 0)
    {
      bReturn = ReadFile(hRead, szbuf, 4096, &dwReadLen, NULL) ;

      if (bReturn && dwReadLen > 0)
      {
        lstrcat(szbufTemp, szbuf) ;
        ::SetWindowText(hwnd, szbufTemp) ;
      }
    }
    
    Sleep(50) ;
    
  }while(TRUE) ;

上传的附件 GUIConsole.rar