进程间通信:匿名管道通信
来源:互联网 发布:公司电脑网络限制 编辑:程序博客网 时间:2024/05/18 17:54
将关于匿名管道通信过程中遇到的问题以及心得总结一下:
使用场合:匿名管道通信对线程间通信和父子进程之间的通信非常有用
一下代码分三部分:
1.创建匿名管道;
2.创建子进程:
(1).使用GetStdHandle函数获取标准输出设备的句柄
(2).使用SetStdHandle函数将标准输出到写匿名管道
(3).使用GetStartupInfo函数获取本进程的startupinfo的信息,为什么要用该函数获得该信息?该结构体的信息不是被赋值了吗?
(4).接着继续对startupinfo结构体赋值,注意与创建其他进程不同,分别对si的五个相关成员进行赋值
(5).createprocess函数的第五个参数必须为TRUE,刚开始给这个值赋FALSE,结果不能实现
3.读取信息
(1).再次调用SetStdHandle函数恢复本进程的标准输出
(2).调用closehandle函数关闭写句柄,如果不写这一句,程序在运行时卡死;
(3).用readfile函数从读句柄端将信息读到一个buffer中
(4).关闭创建进程时的句柄
注意:1.调用getlasterror函数必须紧跟要被检测函数之后;
2.数组最好也要初始化,在本例中输出字符串后面跟着一堆乱码
2.在edit控件中显示必须要updatedata(false);
HANDLE hReadPipe; HANDLE hWritePipe; SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) MessageBox(L"create pipe fail"); //创建进程 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); HANDLE hTemp = GetStdHandle(STD_OUTPUT_HANDLE);// // 设置标准输出到匿名管道 SetStdHandle(STD_OUTPUT_HANDLE, hWritePipe);// GetStartupInfo(&si); // 获取本进程的STARTUPINFO结构信息 si.hStdInput = hReadPipe; si.hStdOutput = hWritePipe; si.hStdError = hWritePipe; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; si.wShowWindow = SW_HIDE;// wchar_t szpath[MAX_PATH] = _T("E:\\tool\\Lenovo Logo Change Tool\\H2OFFT-Wx64.exe -edt4s:\"add:gif:1920x1080\" -edt4f:\"y-logo-gif64.gif\""); wchar_t szPath[MAX_PATH] = _T("F:\\code\\test\\MyDlgClass1\\Debug\\Untitled.exe sa"); if (!CreateProcess(NULL, szPath, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) MessageBox(L"create process fail"); //读取信息 char szBuffer[MAX_PATH] = {0}; DWORD dReadNum; SetStdHandle(STD_OUTPUT_HANDLE, hTemp); // 恢复本进程的标准输出// CloseHandle(hWritePipe); // 关闭写句柄//必须加这一句 ,否则卡死 Sleep(1000); if (ReadFile(hReadPipe, szBuffer, MAX_PATH, &dReadNum, NULL) == NULL) { m_Errorcode = GetLastError(); //GetLasrError函数 MessageBox(L"read fail"); } // szBuffer[MAX_PATH] =L'/0'; m_EditTest = szBuffer; CloseHandle(pi.hProcess); CloseHandle(pi.hThread); UpdateData(false);
0 0
- 进程间通信-匿名管道
- 进程间通信 - 匿名管道
- 进程间通信匿名管道
- 进程间通信-匿名管道
- 进程间通信:匿名管道通信
- 进程间通信之匿名管道通信
- 进程通信-匿名管道
- 进程通信 - 匿名管道
- 进程间通信之管道通信(匿名管道)
- 匿名管道--进程间的通信
- 进程间通信-匿名管道
- 通过匿名管道实现进程间通信
- 进程间通信 - 匿名管道实现
- 进程间通信详解 - 匿名管道实现
- 进程间通信——匿名管道
- 通过匿名管道实现进程间通信
- 进程间通信详解 - 匿名管道实现
- 进程间通信 - 匿名管道实现
- MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突
- C++标准程序库-通用工具
- n-1位数
- 【2015福州夏令营】三重镇
- 代理模式(一)
- 进程间通信:匿名管道通信
- Linux定时备份Mysql
- 微信支付
- ddms下面找不到gymotion模拟器
- MACHINE_START与MACHINE_END
- 树形图计数
- linux下I2C驱动架构全面分析
- mysql innobackupex备份恢复
- dotnet的安装包例子