gpt4 book ai didi

delphi - 从生成的进程中读取会挂起两个进程

转载 作者:行者123 更新时间:2023-12-03 18:32:20 24 4
gpt4 key购买 nike

我正在尝试关注 this msdn article .

我创建了一个非常简单的控制台应用程序。

Writeln('Take a nap.');
Sleep(1000);
Writeln('Done.');

我正在使用以下代码启动控制台应用程序并(尝试)读取其输出。控制台应用程序和主应用程序都挂起。
procedure TForm1.Button1Click(Sender: TObject);
const
PATH: WideString = 'c:\tmp\nap.exe';
var
ProcInfo: TProcessInformation;
StartInfo: TStartupInfo;
WorkingDir: WideString;
StdOutRead, StdOutWrite: THandle;
Attr: SECURITY_ATTRIBUTES;
N: Cardinal;
Buf: Array [0.. 5000] of Byte;
begin
FillChar(Attr, SizeOf(SECURITY_ATTRIBUTES), 0);
Attr.nLength := SizeOf(SECURITY_ATTRIBUTES);
Attr.bInheritHandle := True;
Attr.lpSecurityDescriptor := nil;

if not (CreatePipe(StdOutRead, StdOutWrite, @Attr, 0)) then
RaiseLastOSError;

FillChar(StartInfo, SizeOf(TStartupInfo), 0);
StartInfo.cb := SizeOf(TStartupInfo);
StartInfo.dwFlags := STARTF_USESTDHANDLES;
StartInfo.hStdOutput := StdOutWrite;
// I've tried creating pipes for stdin and stderr to no avail

WorkingDir := ExtractFilePath(PATH);
if not CreateProcess(nil, PWideChar(PATH), nil, nil, false, 0, nil, PWideChar(WorkingDir), StartInfo, ProcInfo) then
RaiseLastOSError;

// this call hangs -- the console app hangs regardless
if not ReadFile(StdOutRead, Buf[0], Length(Buf), N, nil) then
RaiseLastOSError;
end;

任何建议...不幸的是 this article也没有帮助。

最佳答案

我能看到的最明显的缺陷是你设置了 bInheritHandlesFalse当您调用 CreateProcess .您必须通过 True当您这样做时,您的代码将按预期工作。 nap.exe 的输出忠实地读入Buf .

关于delphi - 从生成的进程中读取会挂起两个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16112720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com