S
slugger
Unregistered / Unconfirmed
GUEST, unregistred user!
我想截获一个由perl编写的dos控制台程序的输出信息并实时显示在我自己的程序上,在论坛上查找了几天,基本上都是使用管道重定向的方法来实现,于是我就参考前辈们的代码自己编了小程序,可是这个小程序对于dos的命令(如cdm、help、ping等)都能截获并正常显示,就是对我想要截获的那个由perl编写的dos控制台程序不奏效。我说明一下,我的小程序只能截获到一小部分信息,而这小部分的信息是被截获程序调用一个C语言模块的信息,而且这仅有的信息必须要等被截获程序关闭后才能显示(被截获程序,是一个循环程序,一旦运行就不会结束的,必须手动强制结束)。我又试过重定向到文件,结果和用管道一样,现在正是束手无策,只可到这里来求助,各位高手看看有什么好建议就尽量提出。<br><br>附上我的管道重定向代码:<br>procedure ThreadProcess.Execute;<br>var<br> hReadPipe,hWritePipe:THandle;<br> si:STARTUPINFO;<br> lsa:SECURITY_ATTRIBUTES;<br> piROCESS_INFORMATION;<br> mDosScreen:String;<br> cchReadBufferWORD;<br> phChar;<br> fnameChar;<br> i,j:integer;<br>begin<br> fname:=allocmem(255);<br> ph:=AllocMem(5000);<br> lsa.nLength :=sizeof(SECURITY_ATTRIBUTES);<br> lsa.lpSecurityDescriptor :=nil;<br> lsa.bInheritHandle :=True;<br><br> if CreatePipe(hReadPipe,hWritePipe,@lsa,0)=false then<br> begin<br> ShowMessage('Can not create pipe!');<br> exit;<br> end;<br> fillchar(si,sizeof(STARTUPINFO),0);<br> si.cb :=sizeof(STARTUPINFO);<br> si.dwFlags :=(STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW);<br> si.wShowWindow :=SW_SHOW;<br> si.hStdOutput :=hWritePipe;<br> StrPCopy(fname,'d:/slu/slu.exe');<br> if CreateProcess( nil, fname, nil, nil, true, 0, nil, 'd:/slu/', si, pi) = False then<br> begin<br> ShowMessage('can not create process');<br> FreeMem(ph);<br> FreeMem(fname);<br> Exit;<br> end;<br> while(true) do<br> begin<br> if not PeekNamedPipe(hReadPipe,ph,1,@cchReadBuffer,nil,nil) then break;<br> if cchReadBuffer<>0 then<br> begin<br> if ReadFile(hReadPipe,ph^,4096,cchReadBuffer,nil)=false then break;<br> ph[cchReadbuffer]:=chr(0);<br> form1.Memo1.Lines.Add(ph);<br> end<br> else if(WaitForSingleObject(pi.hProcess ,0)=WAIT_OBJECT_0) then break;<br> Sleep(100);<br> end;<br> ph[cchReadBuffer]:=chr(0);<br> form1.Memo1.Lines.Add(ph);<br> CloseHandle(hReadPipe);<br> CloseHandle(pi.hThread);<br> CloseHandle(pi.hProcess);<br> CloseHandle(hWritePipe);<br> FreeMem(ph);<br> FreeMem(fname);<br>end;