关于DELPHI管道的问题

zbdenghu 2008-08-01 09:20:51
从程序里去调用一个命令行程序,如何才能让命令返回的信息实时的显示出来呢?
我现在有一个DELPHI命名管道的DEMO,可是要等命令行程序执行完毕才能显示到Memo里,请高手指教!
附源码:

function WinExecAndWait32(FileName: String; Visibility: Integer;
var mOutputs: string): Cardinal;
var
sa: TSecurityAttributes;
hReadPipe,hWritePipe: THandle;
ret: BOOL;
strBuff: array[0..255] of char;
lngBytesread: DWORD;

WorkDir: String;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(sa, Sizeof(sa), #0);
sa.nLength := Sizeof(sa);
sa.bInheritHandle := True;
sa.lpSecurityDescriptor := nil;
ret := CreatePipe(hReadPipe, hWritePipe, @sa, 0);

WorkDir := ExtractFileDir(Application.ExeName);
FillChar(StartupInfo,Sizeof(StartupInfo), #0);
StartupInfo.cb:=Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
StartupInfo.wShowWindow:=Visibility;

StartupInfo.hStdOutput:=hWritePipe;
StartupInfo.hStdError:=hWritePipe;

if not CreateProcess(nil,
PChar(FileName), { pointer to command line string }
@sa, { pointer to process security attributes }
@sa, { pointer to thread security attributes }
True, { handle inheritance flag }
// CREATE_NEW_CONSOLE or { creation flags }
NORMAL_PRIORITY_CLASS,
nil, { pointer to new environment block }
PChar(WorkDir), { pointer to current directory name, PChar}
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) { pointer to PROCESS_INF }
then Result := INFINITE {-1} else
begin
// Form1.Hide;
// FileOpen(FileName,fmShareExclusive);
// SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
ret := CloseHandle(hWritePipe);
mOutputs := '';
while ret do
begin
FillChar(strBuff,Sizeof(strBuff),#0);
ret := ReadFile(hReadPipe, strBuff, 256, lngBytesread, nil);
mOutputs := mOutputs + strBuff;
end;

Application.ProcessMessages;
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
CloseHandle(ProcessInfo.hProcess); { to prevent memory leaks }
CloseHandle(ProcessInfo.hThread);
// Form1.Close; { exit application }
ret := CloseHandle(hReadPipe);
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
Val:Cardinal;
mOutputs:string;
i:integer;
begin
//Memo1显示结果
Memo1.Lines.Clear;

//Memo2输入的 command 命令
Val := WinExecAndWait32(Memo2.Text, SW_HIDE, mOutputs);
//显示结果
Memo1.Lines.Add('******Result******'+#13#10+IntToStr(Val));
i:=1;
while i<=length(mOutputs) do
begin
if mOutputs[i]=#10 then
begin
Insert(#13,mOutputs,i);
i:=i+2;
end
else
Inc(i);
end;
Memo1.Lines.Add('******Echo******'+#13#10+mOutputs);
end;





...全文
296 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
deucee 2008-10-10
  • 打赏
  • 举报
回复
在你的WinExecAndWait32里面,CreateProcess之后就该直接返回了。ReadFile应该放到一个timer事件里面,或者建立一个thread

另外,没有必要用ReadFile, 用THandleStream更方便.

雄牛 2008-08-01
  • 打赏
  • 举报
回复

路过...

友情UP......

zwjchina 2008-08-01
  • 打赏
  • 举报
回复
请参考这里:
http://topic.csdn.net/u/20080603/08/cd8b25f1-6f8f-4442-859e-d794dbb2ee32.html
legend888888 2008-08-01
  • 打赏
  • 举报
回复
up

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧