小弟进来写一个小程序,需要把控制台程序的命令行输出,提取出来显示在一个memo上。感觉没什么问题啊!那位大虾来看看噢!!(pf:源程序)procedure TForm1.Button1Click(Sender: TObject);
var
hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2:Thandle;
sa:SECURITY_ATTRIBUTES;
siinfo:STARTUPINFO ;
ProcessInformation:PROCESS_INFORMATION ;
s1,cmdline:string;
lbytesread:integer;
buff:pchar;
tt:cardinal;
lb:longbool ;
po:poverlapped;
begingetmem(buff,1024);
sa.nLength:=12;
sa.lpSecurityDescriptor:=0;
sa.bInheritHandle:=true;
CreatePipe(hReadPipe1,hWritePipe1,@sa,0);
cmdLine := 'ipconfig.exe';
ZeroMemory(@siinfo,sizeof(siinfo));
siinfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
siinfo.wShowWindow := SW_show;
siinfo.hStdInput:=hReadPipe2;
siinfo.hStdOutput:=hWritePipe1;
siinfo.hStdError:=hWritePipe1;
CreateProcess(nil,pchar(cmdLine),nil,nil,lb,0,nil,nil,siinfo,ProcessInformation);
while (true) do
begin
PeekNamedPipe(hReadPipe1,@Buff,1024,@lBytesRead,nil,nil);
tt:=lbytesread;
edit1.text:=inttostr(lbytesread);
if (tt<>0) then
  begin
 if  ReadFile(hwritePipe1,Buff,10,tt,po) then
  showmessage(inttostr(tt));
  end;
application.ProcessMessages ;
end;
end;

解决方案 »

  1.   

    不好意思,上面的有点问题,应该是下面的:(还不对)procedure TForm1.Button1Click(Sender: TObject);
    var
    hReadPipe1,hWritePipe1,hReadPipe2,hWritePipe2:Thandle;
    sa:SECURITY_ATTRIBUTES;
    siinfo:STARTUPINFO ;
    ProcessInformation:PROCESS_INFORMATION ;
    s1,cmdline:string;
    lbytesread:integer;
    buff:pchar;
    tt:cardinal;
    lb:longbool ;
    po:poverlapped;begingetmem(buff,1024);
    sa.nLength:=12;
    sa.lpSecurityDescriptor:=0;
    sa.bInheritHandle:=true;
    CreatePipe(hReadPipe1,hWritePipe1,@sa,0);
    cmdLine := 'ping.exe';
    ZeroMemory(@siinfo,sizeof(siinfo));
    siinfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
    siinfo.wShowWindow := SW_show;
    siinfo.hStdInput:=hReadPipe2;
    siinfo.hStdOutput:=hWritePipe1;
    siinfo.hStdError:=hWritePipe1;
    CreateProcess(nil,pchar(cmdLine),nil,nil,lb,0,nil,nil,siinfo,ProcessInformation);
    while (true) do
    begin
    PeekNamedPipe(hReadPipe1,@Buff,1024,@lBytesRead,nil,nil);
    tt:=lbytesread;
    edit1.text:=inttostr(lbytesread);
    if (tt<>0) then
      begin
     if  ReadFile(hreadPipe1,Buff,10,tt,po) then
      showmessage(inttostr(tt));
      end;
    application.ProcessMessages ;
    end;