双管道(CreatePipe)与cmd.exe进程间通信的有关问题
双管道(CreatePipe)与cmd.exe进程间通信的问题
先贴代码:
问题是:
为什么启动cmd.exe时能读到(ReadFile)的初始化信息,
但是再WriteFile(往管道里写数据后),cmd却没有任何信息,即PeekNamedPipe函数中的参数lBytesRead总是为零?
难道是管道没写进去?
------解决方案--------------------
先贴代码:
- 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; }