sez Guest
|
Posted: Fri Mar 31, 2006 10:03 pm Post subject: pipe! receive data but cant send... |
|
|
Hi, this is my data receiving code from one console application to VCL
C++ builder memo.
Can you tell my how to send code from VCL to console application?
Please give a brief example.
Thanks in advance...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//create pipe for the console stdout
SECURITY_ATTRIBUTES sa;
ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle=true;
sa.lpSecurityDescriptor=NULL;
HANDLE ReadPipeHandle;
HANDLE WritePipeHandle; // not used here
if(!CreatePipe(&ReadPipeHandle,&WritePipeHandle,&sa,0))
RaiseLastWin32Error();
//Create a Console
STARTUPINFO si;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow=SW_HIDE;
si.hStdOutput=WritePipeHandle;
si.hStdError=WritePipeHandle;
PROCESS_INFORMATION pi;
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
if(!CreateProcess("filename.exe",NULL,NULL,NULL,true,0,NULL,NULL,&si,&pi))
RaiseLastWin32Error();
//Read from pipe
char Data[1024];
for (;
{
DWORD BytesRead;
DWORD TotalBytes;
DWORD BytesLeft;
//Check for the presence of data in the pipe
if(!PeekNamedPipe(ReadPipeHandle,Data,sizeof(Data),&BytesRead,
&TotalBytes,&BytesLeft))RaiseLastWin32Error();
//If there is bytes, read them
if(BytesRead)
{
if(!ReadFile(ReadPipeHandle,Data,sizeof(Data)-1,&BytesRead,NULL))
RaiseLastWin32Error();
Data[BytesRead]='\0';
Memo1->Lines->Add(AnsiString(Data));
}
else
{
//Is the console app terminated?
if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)break;
}
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(ReadPipeHandle);
CloseHandle(WritePipeHandle);
} |
|