procedure TForm2.Button1Click(Sender: TObject);
var
S:TStartupInfo;
P:TProcessInformation;
Sec:TSecurityAttributes;
read,write:THandle;
buffer:array[0..511] of char;
byteread,aprun:DWORD;
hs:THandleStream;
sl:TStrings;
ec:Cardinal;
begin
Memo1.Lines.Clear;
Sec.nLength:=Sizeof(TSecurityAttributes);
Sec.bInheritHandle:=True;
Sec.lpSecurityDescriptor:=nil;
if not CreatePipe(read,write,@Sec,0) then
raise Exception.Create('create pipe failed');
FillChar(S,Sizeof(TStartupInfo),0);
S.cb:=Sizeof(TStartupInfo);
S.wShowWindow:=SW_HIDE;
S.dwFlags:=STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW;
S.hStdOutput:=write;
S.hStdError:=write;
if not CreateProcess(nil,Pchar(edit1.Text),nil,nil,True,NORMAL_PRIORITY_CLASS,nil,nil,S,P) then
Raise Exception.Create('Create Process Failed');
repeat
aprun:=WaitForSingleObject(P.hProcess,250);
Application.ProcessMessages;
until aprun<>WAIT_TIMEOUT;
hs:=THandleStream.Create(read);
if hs.Size > 0 then
begin
sl:=TStringList.Create;
sl.LoadFromStream(hs);
Memo1.Text:=sl.Text;
sl.Free;
end;
hs.Free;
Label1.Caption:='命令执行完毕。';
CloseHandle(P.hProcess);
CloseHandle(P.hThread);
CloseHandle(read);
CloseHandle(write);
end;
问题是 如果运行netstat -an 命令(即 edit.text = 'netstat -an')时,WaitForSingleObject一直返回WAIT_TIMEOUT。用任务管理器查看netstat.exe没有退出。一直在运行。
经测试发现运行 netstat -b 或者 netstat -n 都正常,运行结果后,用任务管理器查看netstat.ext进程退出。只要加上-a参数,WaitForSingleObject就超时,netstat.exe没有退出。请高手或遇到类似情况的帮忙看看!谢谢
var
S:TStartupInfo;
P:TProcessInformation;
Sec:TSecurityAttributes;
read,write:THandle;
buffer:array[0..511] of char;
byteread,aprun:DWORD;
hs:THandleStream;
sl:TStrings;
ec:Cardinal;
begin
Memo1.Lines.Clear;
Sec.nLength:=Sizeof(TSecurityAttributes);
Sec.bInheritHandle:=True;
Sec.lpSecurityDescriptor:=nil;
if not CreatePipe(read,write,@Sec,0) then
raise Exception.Create('create pipe failed');
FillChar(S,Sizeof(TStartupInfo),0);
S.cb:=Sizeof(TStartupInfo);
S.wShowWindow:=SW_HIDE;
S.dwFlags:=STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW;
S.hStdOutput:=write;
S.hStdError:=write;
if not CreateProcess(nil,Pchar(edit1.Text),nil,nil,True,NORMAL_PRIORITY_CLASS,nil,nil,S,P) then
Raise Exception.Create('Create Process Failed');
repeat
aprun:=WaitForSingleObject(P.hProcess,250);
Application.ProcessMessages;
until aprun<>WAIT_TIMEOUT;
hs:=THandleStream.Create(read);
if hs.Size > 0 then
begin
sl:=TStringList.Create;
sl.LoadFromStream(hs);
Memo1.Text:=sl.Text;
sl.Free;
end;
hs.Free;
Label1.Caption:='命令执行完毕。';
CloseHandle(P.hProcess);
CloseHandle(P.hThread);
CloseHandle(read);
CloseHandle(write);
end;
问题是 如果运行netstat -an 命令(即 edit.text = 'netstat -an')时,WaitForSingleObject一直返回WAIT_TIMEOUT。用任务管理器查看netstat.exe没有退出。一直在运行。
经测试发现运行 netstat -b 或者 netstat -n 都正常,运行结果后,用任务管理器查看netstat.ext进程退出。只要加上-a参数,WaitForSingleObject就超时,netstat.exe没有退出。请高手或遇到类似情况的帮忙看看!谢谢
解决方案 »
- 求补丁d5adoupdate2.exe,网上联接都失效了,多谢大家
- [程序中函数中址]与串口有关,没法调试,想请教大家,串口发送程序终止的原因?
- 如何用postmessage发送组合键的消息,如向RichEdit发送Ctrl+End?
- DBGrid中怎么确定选种的记录是当前DBGrid中的第几条
- 如何在Tedit中截获Alt按键,Tab按键
- 再问Delphi的打印问题
- 请教个问题:没有源代码能否有办法调整*.QRP报表格式?存为QRP文件后能否有什么程序可以编辑
- delphi+oracle中如何给sql语句中的日期型字段传参数呢?。。急急急!!!!!!!!!
- 关于动态设置控件大小的问题,很奇怪.
- delphi中有没有判断一个字符串是不是数字的函数?
- 控制treeview的水平滚动条
- 危险!!! 三层 skt server自动退出!
until aprun <>WAIT_OBJECT_0;
改成 WAIT_OBJECT_0 可以解决我的问题。
但是netstat -n 确无法正常运行。
有什么其他方法能准确判断createprocess创建的进程执行完毕
把你的repeat循环换为下面的试试
repeat
GetExitCodeProcess(p.hProcess, ExitCode);
Application.ProcessMessages;
until ExitCode <> STILL_ACTIVE;
现在的问题不是在用什么方法判定进程执行完毕。我观察发现。
如果执行netstat -n命令,则执行完成后用任务管理器查看,netstat.exe就退出;
但是只要加上-a,则创建的进程不会退出。一直在运行。 所以不管用什么方法判定进程执行完毕都会死在那里,因为进程不会退出,一直在运行。
这程序我在我同事的机器上有一次成功退出,接着再运行又不可以了
但是在我机器上一直不能正常退出。
我跟我同事机器都是xp。有点奇怪。问题已经解决。我已经换成用shellexecute执行bat实现了。
谢谢各位!