MFC-单管道

单管道通信,每传输一次数据就要创建一个新的进程,速度很慢,但是简单.

下面做一个读取命令行内容的例子

效果如图:
MFC-单管道_第1张图片

全部的代码都写到执行按钮中,代码如下


    HANDLE hWritePipe = nullptr;//把内容写到管道的句柄
    HANDLE hReadPipe = nullptr;//从管道里读取内容的句柄
    //管道的安全属性
    SECURITY_ATTRIBUTES sa = { 0 };
    sa.nLength = sizeof(sa);
    sa.bInheritHandle = TRUE;//句柄可继承
    sa.lpSecurityDescriptor = nullptr;//安全描述,设为null

    //创建管道
    BOOL bCreatePipe = CreatePipe(
        &hReadPipe, //把内容写到管道的句柄
        &hWritePipe,//从管道里读取内容的句柄
        &sa,        //管道安全属性
        0           //管道大小,0表示默认大小
        );
    if (!bCreatePipe)
    {
        AfxMessageBox(TEXT("创建管道失败!"));
        return;
    }

    //进程信息结构
    PROCESS_INFORMATION pi = { 0 };
    //启动信息
    STARTUPINFO si = { 0 };
    si.cb = sizeof(STARTUPINFO);
    //因为是但管道,所以命令行的输入是标准输入
    si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
    //命令框的输出接到管道的hWrite,这样就能直接把内容输出到管道中
    si.hStdOutput = si.hStdError = hWritePipe;
    si.wShowWindow = SW_HIDE;//隐藏进程窗口
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

    //获取命令
    TCHAR szCmdLine[MAX_PATH * 2] = {0};                  
    GetDlgItemText(IDC_EDIT_CMD, szCmdLine, MAX_PATH * 2);

    //创建进程
    BOOL bCreateProc = CreateProcess(nullptr, szCmdLine, nullptr, 
        nullptr, TRUE, 0, nullptr, nullptr, &si, &pi);
    if (!bCreateProc)
    {
        AfxMessageBox(TEXT("创建进程失败!"));
        return;
    }
    else
    {
        //不需要这两个句柄,关掉他们
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);

        //读取管道内容时要先关闭管道的另一端
        CloseHandle(hWritePipe);

        //创建成功后,把管道的内容读取出来
        //注意,只能用ASCII编码格式读,因为命令行窗口的内容都是ASCII编码的
        //如果CString TCHAR 来读会乱码
        char szBuffer[4096] = { 0 };
        while (true)
        {
            memset(szBuffer, 0, sizeof(szBuffer));
            //如果管道里没内容就会读不到返回FALSE
            if (!ReadFile(hReadPipe,szBuffer,sizeof(szBuffer),nullptr,nullptr))
                 break;
            m_content += szBuffer;
        }
        //显示内容
        UpdateData(FALSE);
        CloseHandle(hReadPipe);
    }

然后输入命令,点击执行即可读取内容显示出来.
如果命令是执行exe文件,则编辑框中无内容显示

你可能感兴趣的:(数据,通信,安全,mfc,管道)