进程间通信:匿名管道通信

将关于匿名管道通信过程中遇到的问题以及心得总结一下:
使用场合:匿名管道通信对线程间通信和父子进程之间的通信非常有用
一下代码分三部分:
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC是微软基于C++的一个应用程序框架,它可以帮助开发人员快速创建Windows应用程序。进程间通信(IPC)是不同进程之间进行数据交换和通信的一种方法。管道是一种常见的IPC机制,它允许两个进程之间进行双向通信。 在MFC中,使用管道进行进程间通信可以分为两个步骤:创建管道和使用管道进行通信。 首先,需要创建一个管道。可以使用CreatePipe函数来创建匿名管道,它接受两个参数,第一个参数是用于接收管道句柄的指针,第二个参数是用于发送管道句柄的指针。成功创建管道后,你将获得两个句柄,一个用于读取数据,一个用于写入数据。 然后,可以使用ReadFile和WriteFile函数来读取和写入管道中的数据。这些函数可以传入一个管道句柄,一个缓冲区来存储数据以及数据的长度。通过这些函数,可以在两个进程之间传递数据。 如果需要实现双向通信,可以在每个进程中使用一个管道来进行读取和写入操作。这样,两个进程就可以通过各自的管道进行双向通信了。例如,进程A使用管道A向进程B发送数据,进程B使用管道B向进程A发送数据。 总结起来,MFC可以使用管道进行进程间通信,通过创建管道和使用ReadFile和WriteFile函数来实现数据的读取和写入。如果需要双向通信,则可以在两个进程中分别创建管道来进行双向数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值