在Delphi程序中如何获得Dos程序的输出屏幕内容(100分)

  • 主题发起人 主题发起人 wfh7710
  • 开始时间 开始时间
W

wfh7710

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi程序中如何获得Dos程序的输出屏幕内容(像Delphi编译器 后台执行Dos编译程序,而在IDE界面下给处系统的编译器输出信息)
 
我想这跟 &nbsp;Windows程序一样的。可以DOS 程序中调用相应的<br>图形用户信息显示函数实现的。
 
跟踪一下看看是否使用了子控件。<br>向子控件发送“获取内容”的消息。
 
利用DOS程序的输出重定向功能 dir &gt;&gt; aa.txt 将DOS程序的输出内容生成临时文件aa.txt,<br>使用DELPHI的FileOpen、FileRead等函数取得aa.txt文件的内容,即可。<br>(别忘了把分给我^_^)
 
<br>用“管道”在这儿搜搜,你会找到答案的。
 
不错,用管道可以做到,我做过一个<br>hryyx的方法不好,如果是这样的话,肯定有问题<br>DOS程序执行时需要一点时间,而程序里调用AA。TXT时可能数据还没传过去。<br>应该创建一线程的方式执行DOS命令,并一直等待他结束。
 
delphi6,win2k:<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,'CMD.EXE /c dir/w');<br><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;
 
我本来想通过管道来通讯,这样我们可以向DOS程序提供信息输入功能。<br><br>(Delphi编译器后台就是Dos编译器)
 
我给你的例子就可以拉,你还不明白???
 
谢谢大家了.<br>是不是所有DOS程序的输出和输入都能被扑捉到呢?
 
谢谢了,发分了
 
后退
顶部