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;
}
posted @ 2021-08-09 15:12  剑客猫  阅读(228)  评论(0编辑  收藏  举报