void __fastcall TForm1::Button1Click(TObject *Sender)
{
char readBuf[5000];
DWORD bytesRead=0;
HANDLE hReadPipe,hWritePipe;
PROCESS_INFORMATION pi;
LPPROCESS_INFORMATION lppi;
SECURITY_ATTRIBUTES lsa; //安全属性
STARTUPINFO myStartup;
lsa.nLength = sizeof(SECURITY_ATTRIBUTES);
lsa.lpSecurityDescriptor = NULL;
lsa.bInheritHandle = true;
lppi = π
//创建管道
if(CreatePipe(&hReadPipe,&hWritePipe,&lsa,0))
ShowMessage("Pipe Created OK ./n");
else{
ShowMessage("Pipe Creation Error");
return;
}
memset(&myStartup,0,sizeof(STARTUPINFO));
myStartup.cb = sizeof(STARTUPINFO);
myStartup.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
myStartup.wShowWindow = SW_HIDE;
myStartup.hStdOutput = hWritePipe;
if(!CreateProcess("d://test.exe",NULL,NULL,NULL,true,CREATE_NEW_CONSOLE,
NULL,NULL,&myStartup,&pi)){
ShowMessage("CreateProcess error:"+IntToStr(GetLastError()));
return;
}
while(true){
bytesRead = 0;
if(!PeekNamedPipe(hReadPipe,readBuf,1,&bytesRead,NULL,NULL))
break;
if(bytesRead){
if(!ReadFile(hReadPipe,readBuf,4096,&bytesRead,NULL))
break;
readBuf[bytesRead] = 0;
Memo1->Text = Memo1->Text+ "Read " + IntToStr(bytesRead)
+ "bytes from pipe" + readBuf;
}else{
if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)
break;
Sleep(256);
}
}
CloseHandle(hReadPipe);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(hWritePipe);
本文介绍了一种通过管道进行进程间通信的方法,并演示了如何使用C++代码创建子进程并与其进行通信的过程。该过程包括创建管道、设置安全属性、启动子进程以及读取子进程输出。
5519

被折叠的 条评论
为什么被折叠?



