Redirecting stdout from a console App to TMemo |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
Redirecting stdout from a console application to a TMemo資料來源:http://www.leunen.com/cbuilder/redirect.html First of all, I have to thank Dima Shamroni who had posted a working example on microsoft.public.vc.mfc and Matt Brunk for his article on www.codeguru.com. This tip is based on their code and simply rewritten for C Builder. It may occur that we need to launch a console application and catch its output normally sent to the standard output (STDOUT). This code snippet catch the stdout of the console and send it to a TMemo using anonymous pipe (unnamed pipe).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("YourProgram.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); } //---------------------------------------------------------------------------網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |