Board logo

标题: 进程间通信 - 匿名管道实现(5) [打印本页]

作者: yuyang911220    时间: 2017-1-25 19:40     标题: 进程间通信 - 匿名管道实现(5)

消息处理函数:
//往匿名管道中写入数据按钮的消息处理函数
void CNoNamedPipeChildDlg::OnBnClickedBtnWritePipe()
{
    //如果子进程还没有获得对匿名管道的读写句柄的话需要先获取句柄
    this->GetReadWriteHandleFromParent();

    ChildWritePipe();
}


//从匿名管道中读取数据按钮的消息处理函数
void CNoNamedPipeChildDlg::OnBnClickedBtnReadPipe()
{
    //如果子进程还没有获得对匿名管道的读写句柄的话需要先获取句柄
    this->GetReadWriteHandleFromParent();

    ChildReadPipe();
}

//从匿名管道读取数据成员函数
void CNoNamedPipeChildDlg::ChildReadPipe(void)
{
    DWORD            dwRead;
    char *            pReadBuf;
    CString            cStrRecvData;

    pReadBuf = new char[dataLength];
    memset(pReadBuf, 0, dataLength);

    //读取数据
    if(!ReadFile(hPipeRead, pReadBuf, dataLength, &dwRead, NULL))
    {
        MessageBox(TEXT("   从匿名管道接收数据失败 ..."),
            TEXT("提示"), MB_ICONERROR);
        return;
    }

    cStrRecvData = "   从匿名管道接收数据成功:    ";
    cStrRecvData += pReadBuf;

    this->m_CStrReadPipe.Empty();
    this->m_CStrReadPipe = pReadBuf;
    UpdateData(FALSE);

    MessageBox(cStrRecvData, TEXT("提示"), MB_ICONINFORMATION);
}

//往匿名管道中写入数据
void CNoNamedPipeChildDlg::ChildWritePipe(void)
{
    UpdateData();

    if(!this->m_CStrWritePipe.IsEmpty())
    {
        char *                pSendData;
        DWORD                dwWrite;
        CString                cStrSendData;

        //在这里需要将 Unicode 字符集转换为 ASCII 字符集
        pSendData = new char[this->m_CStrWritePipe.GetLength() + 1];
        memset(pSendData, 0, this->m_CStrWritePipe.GetLength() + 1);
        for(int i=0;i<this->m_CStrWritePipe.GetLength();i++)
        {
            pSendData[i] = (char)this->m_CStrWritePipe.GetAt(i);
        }

        //写入数据
        if(!WriteFile(hPipeWrite, pSendData,
            this->m_CStrWritePipe.GetLength(), &dwWrite, NULL))
        {
            MessageBox(TEXT("   给匿名管道发送数据失败 ..."),
                TEXT("提示"), MB_ICONERROR);
            return;
        }

        cStrSendData = "给匿名管道发送数据成功:    ";
        cStrSendData += this->m_CStrWritePipe;

        this->m_CStrWritePipe.Empty();
        UpdateData(FALSE);

        MessageBox(cStrSendData, TEXT("提示"), MB_ICONINFORMATION);
    }
    else
    {
        MessageBox(TEXT("   请先输入要发送给匿名管道的数据 ..."),
            TEXT("提示"), MB_ICONERROR);
    }
}

//需要获取继承自父进程的匿名管道读写句柄
void CNoNamedPipeChildDlg::GetReadWriteHandleFromParent(void)
{
    if(this->m_IsGettedParentHandle == FALSE)
    {
        hPipeRead = GetStdHandle(STD_INPUT_HANDLE);
        hPipeWrite = GetStdHandle(STD_OUTPUT_HANDLE);

        this->m_IsGettedParentHandle = TRUE;
    }
}




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0