双管道(CreatePipe)与cmd.exe进程间通信的有关问题

双管道(CreatePipe)与cmd.exe进程间通信的问题
先贴代码:
C/C++ code

HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; //四个HANDLE 用来创建两个管道

UINT __stdcall sendDataThread(LPVOID lpParam)//启动线程创建管道与cmd关联
{
    

    char Buff[SEND_BUFF_SIZE];
    TCHAR sendBuff[SEND_BUFF_SIZE];
    SECURITY_ATTRIBUTES sa;
    sa.nLength=12;
    sa.lpSecurityDescriptor=0;
    sa.bInheritHandle=true;    
    int ret;

    if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道
    {
        return -1;
    }
    if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))
    {
        return -1;
    }

    STARTUPINFO si;
    ZeroMemory(&si,sizeof(si));
    GetStartupInfo(&si);
    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    si.wShowWindow = SW_HIDE;
    si.hStdInput = hReadPipe2;
    si.hStdOutput = si.hStdError = hWritePipe1;

    TCHAR cmdLine[256] = {0};
    GetSystemDirectory(cmdLine,sizeof(cmdLine));
    wcscat(cmdLine,L"\\cmd.exe");

    PROCESS_INFORMATION ProcessInformation;
    if(CreateProcess(cmdLine,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&ProcessInformation) == 0)
    {
        return -1;
    }
    
    unsigned long lBytesRead;
         Sleep(100);

    while(TRUE) //开始循环读取或写入信息
    {
         ret=PeekNamedPipe(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0,0);//管道是否有数据可读
         if(lBytesRead)    
         {
            //第一次可以读到cmd的初始化信息
            ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据
            if(!ret)
                break;
            //如果读到数据,则对数据进行下一步处理。。。。。。。        
          }
          else
          {
            
              if(!WriteFile(hWritePipe2,L"dir",sizeof(L"dir"),&lBytesRead,0))                     
                {
                        return -1;
              }
            //这时写数据成功,但是管道没反应,PeekNamedPipe的lBytesRead为0
           }
    
    } 

    return 0;
}



问题是:
为什么启动cmd.exe时能读到(ReadFile)的初始化信息,
但是再WriteFile(往管道里写数据后),cmd却没有任何信息,即PeekNamedPipe函数中的参数lBytesRead总是为零?
难道是管道没写进去?

------解决方案--------------------
C/C++ code
HANDLE hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2; //四个HANDLE 用来创建两个管道


UINT __cdecl sendDataThread(LPVOID lpParam)//启动线程创建管道与cmd关联
{
    TCHAR Buff[SEND_BUFF_SIZE] = {0};
    TCHAR sendBuff[SEND_BUFF_SIZE] = _T("dir \n");
    SECURITY_ATTRIBUTES sa;
    sa.nLength=sizeof(sa);
    sa.lpSecurityDescriptor=0;
    sa.bInheritHandle=true;    
    int ret;

    if(!CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0))//创建两个匿名管道
    {
        return -1;
    }
    if(!CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0))
    {
        return -1;
    }

    STARTUPINFO si;
    ZeroMemory(&si,sizeof(si));
    GetStartupInfo(&si);
    si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
    si.wShowWindow = SW_HIDE;
    si.hStdInput = hReadPipe2;
    si.hStdOutput = si.hStdError = hWritePipe1;

    TCHAR cmdLine[256] = {0};
    GetSystemDirectory(cmdLine,sizeof(cmdLine));
    _tcscat(cmdLine, _T("\\cmd.exe"));

    PROCESS_INFORMATION ProcessInformation;
    if(CreateProcess(cmdLine,NULL,NULL,NULL,TRUE,0,NULL,NULL,&si,&ProcessInformation) == 0)
    {
        return -1;
    }
    
    unsigned long lBytesRead;
         Sleep(100);

    while(TRUE) //开始循环读取或写入信息
    {
         ret=PeekNamedPipe(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0,0);//管道是否有数据可读
         if(lBytesRead)    
         {
            //第一次可以读到cmd的初始化信息
             memset(Buff, 0, sizeof(Buff));
            ret=ReadFile(hReadPipe1,Buff,SEND_BUFF_SIZE,&lBytesRead,0);//读取管道里的数据
            if(!ret)
                break;
            //如果读到数据,则对数据进行下一步处理。。。。。。。        
          }
          else
          {
              if(!WriteFile(hWritePipe2, sendBuff,sizeof(sendBuff),&lBytesRead,0))                     
                {
                        return -1;
              }
            //这时写数据成功,但是管道没反应,PeekNamedPipe的lBytesRead为0
           }
        AfxMessageBox(CString(Buff));
    } 
    
    return 0;

}