关于用管道操作控制台程序的问题 ( 积分: 30 )

  • 主题发起人 主题发起人 sy0116
  • 开始时间 开始时间
S

sy0116

Unregistered / Unconfirmed
GUEST, unregistred user!
我用下面的代码实现了将控制台程序输出的数据用管道显示到我的程序的Memo1中的功能,但是,要怎样才能向控制台程序中输入数据呢?比如说,用Dospipe('runas&nbsp;/user:sy0116&nbsp;&quot;D:/WINPENJR/win32/Custom.exe&quot;');<br>运行runas命令时memo1中显示要输入密码,这时应该怎么修改程序实现输入功能呢?<br>var<br>&nbsp;&nbsp;Form1:&nbsp;TForm1;<br>&nbsp;&nbsp;stdoutr,stdoutw,stdinr,stdinw:THandle;<br>&nbsp;&nbsp;si:STARTUPINFO;<br>&nbsp;&nbsp;sa:SECURITY_ATTRIBUTES;<br>&nbsp;&nbsp;pi:PROCESS_INFORMATION;<br>&nbsp;&nbsp;buffer:array&nbsp;[0..255]&nbsp;of&nbsp;Char;<br>&nbsp;&nbsp;bytesread:Cardinal;<br>&nbsp;&nbsp;line:string;<br>implementation<br><br>{$R&nbsp;*.dfm}<br>function&nbsp;Dospipe(cmd:string):string;<br>begin<br>&nbsp;&nbsp;with&nbsp;sa&nbsp;do<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;nLength:=SizeOf(sa);<br>&nbsp;&nbsp;&nbsp;&nbsp;bInheritHandle:=True;<br>&nbsp;&nbsp;&nbsp;&nbsp;lpSecurityDescriptor:=nil;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;CreatePipe(stdoutr,stdoutw,@sa,0);<br>&nbsp;&nbsp;//CreatePipe(stdinr,stdinw,@sa,0);<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(@si,SizeOf(si));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.cb:=SizeOf(si);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.dwFlags:=STARTF_USESHOWWINDOW&nbsp;+&nbsp;STARTF_USESTDHANDLES;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.wShowWindow:=SW_HIDE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.hStdOutput:=stdoutw;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.hStdError:=stdoutw;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.hStdInput:=GetStdHandle(stdinr);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//si.hStdInput:=stdinr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateProcess(nil,PChar(cmd),nil,nil,True,0,nil,nil,SI,PI);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(stdoutw);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repeat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadFile(stdoutr,buffer,255,bytesread,nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;bytesread&gt;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer[bytesread]:=#0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line:=line+buffer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;until&nbsp;bytesread=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(pi.hThread);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(pi.hProcess);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;Result:=line;<br>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(stdoutr);<br>&nbsp;&nbsp;&nbsp;&nbsp;//CloseHandle(stdinw);<br>&nbsp;&nbsp;end;<br>end;<br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;buffer:PChar;<br>begin<br>&nbsp;&nbsp;Memo1.Lines.Text:=Dospipe('ipconfig');<br>end;
 
unit&nbsp;uMain;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;SysUtils,&nbsp;Variants,&nbsp;Classes,&nbsp;Graphics,&nbsp;Controls,&nbsp;Forms,<br>&nbsp;&nbsp;Dialogs,&nbsp;StdCtrls,&nbsp;ExtCtrls,&nbsp;ShellCtrls;<br>const<br>&nbsp;&nbsp;&nbsp;&nbsp;ReadBuffer&nbsp;=&nbsp;255;<br>type<br>&nbsp;&nbsp;TForm1&nbsp;=&nbsp;class(TForm)<br>&nbsp;&nbsp;&nbsp;&nbsp;Memo1:&nbsp;TMemo;<br>&nbsp;&nbsp;&nbsp;&nbsp;Timer1:&nbsp;TTimer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Panel1:&nbsp;TPanel;<br>&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1:&nbsp;TComboBox;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;FormCreate(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;FormClose(Sender:&nbsp;TObject;&nbsp;var&nbsp;Action:&nbsp;TCloseAction);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Timer1Timer(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;ComboBox1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;ComboBox1Select(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Memo1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;WriteToPipe(Pipe:&nbsp;THandle;&nbsp;Value:&nbsp;string);<br>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;ReadFromPipe(Pipe:&nbsp;THandle):&nbsp;string;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Private&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;ReadPipeIn,&nbsp;WritePipeIn,ReadPipeOut,&nbsp;WritePipeOut:&nbsp;THandle;<br>&nbsp;&nbsp;&nbsp;&nbsp;ProcessInfo:&nbsp;TProcessInformation;<br>&nbsp;&nbsp;&nbsp;&nbsp;Buffer:&nbsp;PChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;BytesRead:&nbsp;DWord;<br>&nbsp;&nbsp;&nbsp;&nbsp;bStart:boolean;<br>&nbsp;&nbsp;&nbsp;&nbsp;s:Tstringlist;<br>&nbsp;&nbsp;end;<br><br>var<br>&nbsp;&nbsp;Form1:&nbsp;TForm1;<br><br>implementation<br><br>{$R&nbsp;*.dfm}<br><br>procedure&nbsp;TForm1.FormCreate(Sender:&nbsp;TObject);<br>var<br>Security:&nbsp;TSecurityAttributes;<br>start:&nbsp;TStartUpInfo;<br>begin<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;s.Destroy;<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;Security&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlength&nbsp;:=&nbsp;SizeOf(TSecurityAttributes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binherithandle&nbsp;:=&nbsp;true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpsecuritydescriptor&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;{创建一个命名管道用来捕获console程序的输出}<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Createpipe(ReadPipeIn,&nbsp;WritePipeIn,&nbsp;@Security,&nbsp;0)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showmessage('无法创建命名管道!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Createpipe(ReadPipeOut,&nbsp;WritePipeOut,&nbsp;@Security,&nbsp;0)&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showmessage('无法创建命名管道!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ReadPipeIn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(WritePipeIn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Buffer&nbsp;:=&nbsp;AllocMem(ReadBuffer&nbsp;+&nbsp;1);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;FillChar(Start,&nbsp;Sizeof(Start),&nbsp;#0);<br>&nbsp;&nbsp;&nbsp;&nbsp;{设置console程序的启动属性}<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;start&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb&nbsp;:=&nbsp;SizeOf(start);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start.lpReserved&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpDesktop&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpTitle&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwX&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwY&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwXSize&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwYSize&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwXCountChars&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwYCountChars&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwFillAttribute&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cbReserved2&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpReserved2&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hStdOutput&nbsp;:=&nbsp;WritePipeOut;&nbsp;//将输出定向到我们建立的WritePipe上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hStdInput&nbsp;:=&nbsp;ReadPipeIn; &nbsp;//将输入定向到我们建立的ReadPipeIn上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hStdError&nbsp;:=&nbsp;WritePipeOut;&nbsp;&nbsp;//将错误输出定向到我们建立的WritePipe上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwFlags&nbsp;:=&nbsp;STARTF_USESTDHANDLES&nbsp;or&nbsp;STARTF_USESHOWWINDOW;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wShowWindow&nbsp;:=&nbsp;SW_hide;&nbsp;&nbsp;//设置窗口为hide<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;CreateProcess(nil,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PChar('cmd.exe'),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Security,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Security,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NORMAL_PRIORITY_CLASS,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nil,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nil,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessInfo)<br>&nbsp;&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showmessage('无法起动cmd!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.Add('程序起动');<br>&nbsp;&nbsp;&nbsp;&nbsp;BytesRead&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;self.bStart&nbsp;:=true;<br><br>end;<br>procedure&nbsp;TForm1.WriteToPipe(Pipe:&nbsp;THandle;&nbsp;Value:&nbsp;string);<br>var<br>&nbsp;&nbsp;len:&nbsp;integer;<br>&nbsp;&nbsp;BytesWrite:&nbsp;DWord;<br>&nbsp;&nbsp;Buffer:&nbsp;PChar;<br>begin<br>&nbsp;&nbsp;len&nbsp;:=&nbsp;Length(Value)&nbsp;+&nbsp;2;<br>&nbsp;&nbsp;Buffer&nbsp;:=&nbsp;PChar(Value&nbsp;+&nbsp;#13#10);<br>&nbsp;&nbsp;WriteFile(Pipe,&nbsp;Buffer[0],&nbsp;len,&nbsp;BytesWrite,&nbsp;nil);<br>end;<br><br>procedure&nbsp;TForm1.FormClose(Sender:&nbsp;TObject;&nbsp;var&nbsp;Action:&nbsp;TCloseAction);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;self.bStart&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TerminateProcess(ProcessInfo.hProcess,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeMem(Buffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ProcessInfo.hProcess);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ProcessInfo.hThread);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ReadPipeOut);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(WritePipeOut);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ReadPipeIn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(WritePipeIn);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;TForm1.Timer1Timer(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;&nbsp;&nbsp;Buf:&nbsp;string;<br>&nbsp;&nbsp;&nbsp;&nbsp;fileSize:dword;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;buf:=&nbsp;ReadFromPipe(&nbsp;ReadPipeOut);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;buf&nbsp;&lt;&gt;''&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.BeginUpdate&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Text&nbsp;:=&nbsp;Memo1.Text&nbsp;+&nbsp;buf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postmessage(Memo1.Handle,EM_SCROLL,SB_BOTTOM,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;application.ProcessMessages;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memo1.SelStart&nbsp;:=&nbsp;length(Memo1.Text);<br> Memo1.Lines.EndUpdate;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;TForm1.ReadFromPipe(Pipe:&nbsp;THandle):&nbsp;string;<br>var<br>&nbsp;&nbsp;Buffer:&nbsp;PChar;<br>&nbsp;&nbsp;BytesRead:&nbsp;DWord;<br>begin<br>&nbsp;&nbsp; Result&nbsp;:=&nbsp;'';<br><br>&nbsp;&nbsp; if&nbsp;GetFileSize(Pipe,&nbsp;nil)&nbsp;=&nbsp;0&nbsp;then&nbsp;Exit;<br><br>&nbsp;&nbsp; Buffer&nbsp;:=&nbsp;AllocMem(ReadBuffer&nbsp;+&nbsp;1);<br><br>&nbsp;&nbsp; repeat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BytesRead&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReadFile(Pipe,&nbsp;Buffer[0],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReadBuffer,&nbsp;BytesRead,&nbsp;nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;BytesRead&nbsp;&gt;&nbsp;0&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buffer[BytesRead]&nbsp;:=&nbsp;#0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OemToAnsi(Buffer,&nbsp;Buffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;Result+string(Buffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp; until&nbsp;(GetFileSize(Pipe,&nbsp;nil)&nbsp;&lt;=&nbsp;0);<br><br>&nbsp;&nbsp; FreeMem(Buffer);<br><br>end;<br><br>procedure&nbsp;TForm1.ComboBox1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Key&nbsp;=&nbsp;#13&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//向管道写入数据。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToPipe(WritePipeIn,ComboBox1.Text);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key&nbsp;:=#0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ComboBox1.Text&nbsp;&lt;&gt;&nbsp;'')then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComboBox1.Items.Insert(0,ComboBox1.Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ComboBox1.Items.Count&nbsp;&gt;&nbsp;20&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1.Items.Delete(ComboBox1.Items.Count&nbsp;-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1.Text:='';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1.ItemIndex:=-1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp; ComboBox1.Tag:=&nbsp;ComboBox1.SelStart&nbsp;;<br>end;<br><br>procedure&nbsp;TForm1.ComboBox1Select(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;length(ComboBox1.Text)&nbsp;&lt;=ComboBox1.Tag&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;ComboBox1.SelStart&nbsp;:=&nbsp;ComboBox1.Tag&nbsp;&nbsp;;<br>end;<br><br>procedure&nbsp;TForm1.Memo1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;PostMessage(ComboBox1.Handle,WM_CHAR,&nbsp;integer(Key),0);<br>&nbsp;&nbsp;&nbsp;&nbsp;Key:=#0;<br>&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1.SetFocus;<br>end;<br><br>end.
 
接受答案了.
 
后退
顶部