15,473
社区成员




SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle=TRUE;
sa.lpSecurityDescriptor=NULL;
HANDLE hChildInWrite,hChildOutWrite,hChildInWrDup,hChildOutRdDup,hChildInRead,hChildOutRead;
HANDLE hStdWrite,hStdRead;
hStdWrite=GetStdHandle(STD_OUTPUT_HANDLE);
hStdRead=GetStdHandle(STD_INPUT_HANDLE);
if(!CreatePipe(&hChildInRead,&hChildInWrite,&sa,0))
{
printf("创建管道失败!\n");
getchar();
return 1;
}
DuplicateHandle(GetCurrentProcess(),hChildInWrite,GetCurrentProcess(),&hChildInWrDup,0,FALSE,DUPLICATE_SAME_ACCESS);
if(!CreatePipe(&hChildOutRead,&hChildOutWrite,&sa,0))
{
printf("创建管道失败!\n");
getchar();
return 1;
}
DuplicateHandle(GetCurrentProcess(),hChildOutRead,GetCurrentProcess(),&hChildOutRdDup,0,FALSE,DUPLICATE_SAME_ACCESS);
PROCESS_INFORMATION pi;
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
STARTUPINFO si;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.hStdError=hChildOutWrite;
si.hStdOutput=hChildOutWrite;
si.hStdInput=hChildInRead;
si.lpTitle=_T("管道子进程");
si.dwFlags=STARTF_USESTDHANDLES;
if(!CreateProcess(_T("D:\\文档\\程序\\C++程序\\Windows编程\\PipeChild\\debug\\PipeChild.exe"),
NULL,
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi))
{
printf("创建子进程失败!\n");
getchar();
return 2;
}
for(int i=0;i <10;i++)
{
TCHAR szMess[1024]={0},szMessage[1024]={0};
DWORD dwRead,dwWrite;
_stprintf(szMess,_T("start:%d\n"),i);
WriteFile(hChildInWrDup,szMess,_tcslen(szMess)*sizeof(TCHAR),&dwWrite,NULL);
ReadFile(hChildOutRdDup,szMessage,sizeof(TCHAR)*1024,&dwRead,NULL);
DWORD dwLen=dwRead;
WriteFile(hStdWrite,szMessage,dwLen,&dwWrite,NULL);
_tprintf(szMessage);
Sleep(1000);
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hChildInWrDup);
CloseHandle(hChildInWrite);
CloseHandle(hChildOutRdDup);
CloseHandle(hChildOutRead);
#define BUFSIZE 4096
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR chBuf[BUFSIZE]={0};
DWORD dwRead, dwWritten;
HANDLE hStdin, hStdout;
BOOL fSuccess;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
hStdin = GetStdHandle(STD_INPUT_HANDLE);
if ((hStdout == INVALID_HANDLE_VALUE) ||
(hStdin == INVALID_HANDLE_VALUE))
ExitProcess(1);
for (;;)
{
// Read from standard input.
fSuccess = ReadFile(hStdin, chBuf, BUFSIZE*sizeof(TCHAR), &dwRead, NULL);
if (! fSuccess || dwRead == 0)
{
MessageBox(NULL,_T("创建管道失败"),_T("消息"),MB_OK);
break;
}
MessageBox(NULL,chBuf,_T("消息"),MB_OK);
// Write to standard output.
fSuccess = WriteFile(hStdout, chBuf, dwRead, &dwWritten, NULL);
if (! fSuccess)
break;
}
return 0;
}