我使用以下代码:
proc := TProcess.Create(nil);
strList := TStringList.Create;
proc.Executable := 'netsh.exe';
proc.Parameters.Add('wlan');
proc.Parameters.Add('show');
proc.Parameters.Add('all');
proc.Options := proc.Options + [poWaitOnExit, poUsePipes];
proc.Execute;
strList.LoadFromStream(proc.Output);
proc.Free;
strList.Free;问题是netsh停留在屏幕上(黑色命令窗口)并且不停止。如果我删除poUsePipes,我可以清楚地看到netsh做了正确的工作,输出是正确的。
发布于 2021-07-26 21:47:39
它与下面的代码一起工作。我已经理解了第一个方法(在我的问题中)在输出中生成许多字节,所以我有一个死锁。仁慈到https://wiki.freepascal.org/Executing_External_Programs (法语版)
const
READ_BYTES = 2048;
var
Form1: TForm1;
proc: TProcess;
strList: TStringList;
ms: TMemoryStream;
n: LongInt;
br: LongInt;
i: longint;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
ms:=TMemoryStream.Create;
br:=0;
proc := TProcess.Create(nil);
strList := TStringList.Create;
proc.Executable := 'netsh.exe';
proc.Parameters.Add('wlan');
proc.Parameters.Add('show');
proc.Parameters.Add('all');
proc.Options := proc.Options + [poUsePipes];
proc.ShowWindow:=TShowWindowOptions.swoHIDE;
proc.Execute;
while proc.Running do
begin
ms.SetSize(br + READ_BYTES);
n:=proc.Output.Read((ms.Memory + br)^, READ_BYTES);
if n > 0
then begin
Inc(br, n);
end
else begin
//no data: wait 100ms
Sleep(100);
end;
end;
//read last part
repeat
ms.SetSize(br + READ_BYTES);
n:=proc.Output.Read((ms.Memory + br)^, READ_BYTES);
if n > 0
then begin
Inc(br, n);
end
until n <= 0;
ms.SetSize(br);
strList.LoadFromStream(ms);
proc.Free;
for i := 0 to strList.Count - 1 do
begin
memo.Append(CP437ToUTF8(strList.Strings[i]));
end;
strList.Free;
end;https://stackoverflow.com/questions/68521454
复制相似问题