MFC-单管道

来源:互联网 发布:php enchant 编辑:程序博客网 时间:2024/05/12 13:50

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

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

效果如图:

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

    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文件,则编辑框中无内容显示

0 0
原创粉丝点击