如何使用匿名管道输出重定向

VC++在多进程通讯中有一种很好的方法就是使用管道技术。
对于很多的初学者来说,不知道IDE的具体原理是什么,作者也是一样,为此迷惑了很多年,也最近才弄清楚

IDE是如何集成了其他的命令行软件的,比如VC中的cc.exe,cl.exe等Devc++中的gcc,WinTC中集成的tc2.0等。

看起来相当的神秘,其实很简单的。这些IDE就只使用了两种比较核心的技术:一是创建一个进程,比如创建一

个cl.exe的进程;二是利用管道与子进程通信,获取其运行结果,把过程输出和结果输出显示在IDE的输出中!

IDE提供的其他的就是一个代码的编辑环境而已!当然,IDE还做了一件幕后的工作就是根据工程的文件组织生

成了一个MAKEFILE文件。所以,只要你熟悉这两种技术,你也可以编写出一个IDE!

具体我也懒得写了,给段自己的代码出来在这里,自己调试下就知道了。

void CDiaDlg::OnGo()
{
 HANDLE hMutex = CreateMutex(NULL,NULL,"Hello");
 
 if(GetLastError() == ERROR_ALREADY_EXISTS)
 {
  CloseHandle(hMutex);
  hMutex = NULL;

  MessageBox("³ÌÐòÒѾ­ÔËÐУ¡","ÏûÏ¢",MB_OK|MB_ICONINFORMATION);
  return;
 }
 
 //´´½¨Ò»¸öÄäÃû¹ÜµÀ£¬ÓÃÀ´Êä³öÐÅÏ¢µÄÖØж¨Ïò
 HANDLE hRead,hWrite;

 SECURITY_ATTRIBUTES sa;
 sa.nLength = sizeof( SECURITY_ATTRIBUTES );
 sa.bInheritHandle = TRUE;
 sa.lpSecurityDescriptor = NULL;

 if( !CreatePipe(&hRead,&hWrite,&sa,0))
 {
  TRACE("Failed to create pipe!/n");
  return;
 }

 STARTUPINFO si;
 PROCESS_INFORMATION pi;

 memset(&si,0,sizeof(si));
 //ZeroMemory(
 si.cb = sizeof(STARTUPINFO);

// GetStartupInfo(&si);

 si.hStdError = hWrite;
 si.hStdOutput = hWrite;

 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
 si.wShowWindow = SW_HIDE;


 memset(&si,0,sizeof(pi));
 
 if( !::CreateProcess(NULL,
  "hello.exe",
  NULL,
  NULL,
  1,
  0,
  NULL,
  NULL,
  &si,
  &pi) )
 {
  TRACE("Failed!/n");
  return;
 }
 CloseHandle(hWrite);

 char buffer[1024] = {0};
 DWORD bytesRead;
 CString str;

 while(TRUE)
 {
  if (ReadFile(hRead,buffer,sizeof(buffer),&bytesRead,NULL) == NULL)
  {
   break;
  }
  str.Format("%s",buffer);
  TRACE(str);
  m_EditStr += str;
  
  UpdateData(FALSE);
  Sleep(200);
 }


 CloseHandle(pi.hThread);

 WaitForSingleObject(pi.hProcess,INFINITE);

 CloseHandle(pi.hProcess);
 CloseHandle(hMutex);
 hMutex = NULL;
}

你可能感兴趣的:(c/c++,vc/MFC)