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

标签 delphi winapi ipc

我正在尝试关注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也没有帮助。

最佳答案

我发现的最明显的缺陷是,当您调用CreateProcess 时,您将bInheritHandles 设置为False。您必须传递 True,当您这样做时,您的代码将按预期工作。 nap.exe 的输出被忠实地读入 Buf

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

相关文章:

c++ - 64 位 DLL 中的 CreateThread 不起作用

c# - 使用c#/c++的windows远程登录api

c++ - 无法更新控制台应用程序中的窗口

ipc - POSIX 消息队列文件夹

delphi - 以编程方式创建和删除表单中的标签

delphi - 使用 DELPHI 和 INDY 10 组件转发和回复电子邮件

Delphi - 使用 ListView 拖放

delphi - 如何创建包含组件的分离器?

C 文件读取 getchar 在 32KB 后产生随机 EOF

c++ - 使用 C++ 在同一系统上运行的两个服务之间的通信