C++的mfc创建管道
2024-09-18 22:37:40
注意:下面的东西是单管道
//创建管道
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;
}
最新文章
- 打造android偷懒神器———RecyclerView的万能适配器
- nodejs npm常用命令
- Callable、Future、RunnableFuture、FutureTask的原理及应用
- js事件处理机制
- linux下socket编程-进程间通信
- 基于nodejs实现js后端化处理
- discuz论坛几种安全策略(二)
- RStudio版本号管理 整合Git
- 201521123119《Java程序设计》第1周学习总结
- SSRS报表服务随笔(rdl报表服务)-报表结构与样式
- [rhel]安装oracle11g
- 浅析java程序的执行过程
- 终于有人把“TCC分布式事务”实现原理讲明白了!
- EQueue
- # Do—Now——团队冲刺博客_总结篇
- jQuery之animate中的queue
- Win7怎么录制电脑屏幕视频
- JavaSE_坚持读源码_ClassLoader对象_Java1.7
- .net正则IP加端口,并返回IP加端口
- Ionic package Error: Registry returned 404 for GET on
热门文章
- [BOM] 封装一下cookie
- golang json 字符串 用 json.Number 解析字段
- flex_bison
- 「SOL」序列计数sequence (模拟赛)
- NSFW.js 前端使用教程
- Selenium私房菜系列4 -- Selenium IDE的使用【QQ】
- 11、java环形单链表解决约瑟夫问题
- Spring入门之使用 spring 的 IOC 解决程序耦合(Spring 基于 XML 的 IOC 细节[掌握])(03-02)
- 软件工程日报六——TextView和button
- python_test_0001_base_string_swap