注:父进程要创建两个匿名管道,并且STARTUPINFO 里面的两个字段很重要
A进程
void CMFCApplication1Dlg::OnBnClickedButton1()
{SECURITY_ATTRIBUTES sa = {};sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.bInheritHandle = TRUE;CreatePipe(&m_hReadPipe, &m_hWritePipe, &sa, 0);CreatePipe(&m_CReadPipe, &m_CWritePipe, &sa, 0);SetStdHandle(STD_INPUT_HANDLE, m_CReadPipe);STARTUPINFO so = {};so.cb = sizeof(STARTUPINFO);so.dwFlags = STARTF_USESTDHANDLES;so.hStdInput = m_hReadPipe; //重要so.hStdOutput = m_CWritePipe;//重要PROCESS_INFORMATION pi = { 0 };CreateProcess(0, "b.exe", &ss, 0, 1, 0, 0, 0, &so, &pi);
}void CMFCApplication1Dlg::OnBnClickedButton2()
{CString str;GetDlgItemText(IDC_EDIT1,str);WriteFile(m_hWritePipe, str.GetBuffer(), str.GetLength(), 0, 0);
}void CMFCApplication1Dlg::OnBnClickedButton3()
{HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);DWORD lpTotalBytesAvail;PeekNamedPipe(handle, 0, 0, 0, &lpTotalBytesAvail, 0);//判断管道有没数据,直接读会导致阻塞if (lpTotalBytesAvail){char buff[256] = {};ReadFile(handle, buff, 256, NULL, 0);SetDlgItemText(IDC_EDIT2, buff);}
}
B进程
void CMFCApplication2Dlg::OnBnClickedButton1()
{HANDLE handle = GetStdHandle(STD_INPUT_HANDLE);DWORD lpTotalBytesAvail;PeekNamedPipe(handle, 0, 0, 0, &lpTotalBytesAvail, 0);//判断管道有没数据,直接读会导致阻塞if (lpTotalBytesAvail){char buff[256] = {};ReadFile(handle, buff, 256, NULL, 0);SetDlgItemText(IDC_EDIT1, buff);}
}void CMFCApplication2Dlg::OnBnClickedButton2()
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);CString str;GetDlgItemText(IDC_EDIT2, str);WriteFile(handle, str.GetBuffer(), str.GetLength(), 0, 0);
}