C++的mfc创建管道
注意:下面的东西是单管道
//创建管道
CString CDownDlg::CreateCmd(CString res) {
CString wrCmd;
CString ans = _T("FALL");
TCHAR* szCmdLine = new TCHAR[MAX_PATH * 2];
//= _T("adb\tdevices")
wrCmd = res;
szCmdLine = wrCmd.GetBuffer(wrCmd.GetLength());
wrCmd.ReleaseBuffer();
/*创建管道,单管道*/
HANDLE hWritePipe = nullptr;//写到管句柄中,nullptr可以暂时理解为null
HANDLE hReadPipe = nullptr;
//管道的安全属性
SECURITY_ATTRIBUTES sa = { 0 };
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;//句柄可以被继承
sa.lpSecurityDescriptor = nullptr;//安全描述
//hWritePipe是往管道里面写的数据的句柄
//hReadPipe是读取管道里面返回的数据的句柄
//sa是管道的安全属性
//0,管道的大小,0为默认大小
//创建管道
BOOL bCreatePipe = CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);
if (FALSE == bCreatePipe) {
//AfxMessageBox(_T("创建管道失败fall"));
return ans;
}
//到此管道创建完毕
//进程信息结构
PROCESS_INFORMATION pi = { 0 };
//启动信息
//STARTUPINFO用于指定新进程的主窗口特性的一个结构
STARTUPINFO si = { 0 };
si.cb = sizeof(STARTUPINFO);
//单管道使用标准输入
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
//管道的输出
si.hStdOutput = si.hStdError = hWritePipe;
si.wShowWindow = SW_HIDE;//隐藏进程窗口
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//获取命令
//GetDlgItemText(IDC_EDIT1, szCmdLine, MAX_PATH * 2);//获取mfc中窗口的文字,获取IDC_EDIT1中的文字
//把idc里面的命令放到szCmdLine中
//创建进程
BOOL bCreateProc = CreateProcess(nullptr, szCmdLine, nullptr, nullptr, TRUE, 0, nullptr, nullptr, &si, &pi);
if (FALSE == bCreateProc)
{
//AfxMessageBox(_T("进程创建失败"));
return ans;
}
//关闭这两个句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
//读取管道中的内容要先关闭另外一端
CloseHandle(hWritePipe);
//创建成功后,把管道的内容读取出来
//注意,只能用ASCII编码格式读,因为命令行窗口的内容都是ASCII编码的
//如果CString TCHAR 来读会乱码
char szBuffer[4096] = { 0 };
while (true)
{
memset(szBuffer, 0, sizeof(szBuffer));
if (FALSE == ReadFile(hReadPipe, szBuffer, sizeof(szBuffer), nullptr, nullptr)) {
break;
}
ans.Empty();
ans += szBuffer;
if (0 == ans.GetLength())
{
ans = _T("return fall");
}
}
return ans;
}