一个范例程序:如何将DOS的标准输出转倒Memo中(0分)

K

kindly

Unregistered / Unconfirmed
GUEST, unregistred user!
整理以前的代码,发现这个程序,很简单的,不过也许有人不知道,就贴了上来[:)]<br><br>unit MainFrm;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>&nbsp; StdCtrls;<br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; OpenDialog1: TOpenDialog;<br>&nbsp; &nbsp; btnRun: TButton;<br>&nbsp; &nbsp; btnOpenfile: TButton;<br>&nbsp; &nbsp; EditFilename: TEdit;<br>&nbsp; &nbsp; Memo1: TMemo;<br>&nbsp; &nbsp; procedure btnOpenfileClick(Sender: TObject);<br>&nbsp; &nbsp; procedure btnRunClick(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br> Form1: TForm1;<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TForm1.btnOpenfileClick(Sender: TObject);<br>begin<br> if opendialog1.Execute then editfilename.Text :=opendialog1.FileName;<br>end;<br><br>procedure TForm1.btnRunClick(Sender: TObject);<br>var<br> hReadPipe,hWritePipe:THandle;<br> si:STARTUPINFO;<br> lsa:SECURITY_ATTRIBUTES;<br> pi:pROCESS_INFORMATION;<br> mDosScreen:String;<br> cchReadBuffer:DWORD;<br> ph:pChar;<br> fname:pChar;<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_HIDE;<br> si.hStdOutput :=hWritePipe;<br> StrPCopy(fname,EditFilename.text);<br> if CreateProcess( nil, fname, nil, nil, true, 0, nil, nil, si, pi) = False then<br> begin<br> ShowMessage('can not create process');<br> FreeMem(ph);<br> FreeMem(fname);<br> Exit;<br> end;<br><br> while(true) do<br> begin<br> if not PeekNamedPipe(hReadPipe,ph,1,@cchReadBuffer,nil,nil) then break;<br> if cchReadBuffer&lt;&gt;0 then<br> begin<br> if ReadFile(hReadPipe,ph^,4096,cchReadBuffer,nil)=false then break;<br> ph[cchReadbuffer]:=chr(0);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Memo1.Lines.Add(ph);<br> end<br> else if(WaitForSingleObject(pi.hProcess ,0)=WAIT_OBJECT_0) then break;<br> Sleep(100);<br> end;<br><br> ph[cchReadBuffer]:=chr(0);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;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;<br><br>end.<br>在命令行里打cmd/c dir看看:)<br>
 
如果你觉得对你有点帮助,顺便帮我提一下,谢谢
 
应该有用吧,现在还是有不少程序运行在CMD下。
 
我正想看看这方面的东东,谢了!
 
你的代码我试了一下,执行完后,可以看到dos结果,可程序却死了<br>why???
 
不可能啊,我没遇到过这种问题啊,你的dos程序是不是运行后需要输入的?<br>我得程序里没有设置ReadPipe,输入是不行的,但输出绝对没问题的
 
不用那么复杂吧,你可以吧DOS命令的结果定向到一个文件中,然后读出文件的内容<br>不就可以了么?<br><br>例如: &nbsp;Dir&gt;c:/windows/temp/temp.txt<br><br>然后,Memo中在读出temp.txt然后删除了temp.txt就可以了!
 
是可以,但是你可以[red]实时[/red]的输出吗?原理其实是一样的,不过是你重定向到一个文件,<br>而我的程序是重定向到自己见的PIPE,你必须等到程序结束才能获得输出,这在不少情况下<br>是不行的。
 
to kindly:<br>&nbsp; 能不能再用一个PIPE进行输入?这样就可以根据输出动态的产生输入了.<br>(我试了几次,均以失败告终[:(])
 
是可以的,si.hStdInput := hWritePipe;
 
有没有入门一点讲解api 的程序呀?<br>一点注释都没有,看不懂呀
 
主要就用到一个API,CreateProcess,参数的说明太长,可以查MSDN<br>CreatePipe是建立管道的API<br>
 
很有用的<br>我认为<br><br>不过我见过此类问题了<br>Demo也有例子吧
 
Demo好像没有吧
 
接受答案了.
 
考!kindly!万分感谢你了!解决了我的一个大难题!向你学习!!!
 
顶部