全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1583
推到 Plurk!
推到 Facebook!

Redirecting stdout from a console App to TMemo

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-17 12:15:11 IP:61.218.xxx.xxx 未訂閱

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 ---[ 發問前請先找找舊文章 ]---
系統時間:2024-05-21 2:17:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!