0

生成されたプロセスからパイプを使用して読み取る場合、入力を求められたときにそのプログラムを終了することは可能ですか?

終了しない場合、パイプが閉じられるまでの通常の ReadFile ループは永久にブロックされます。

tsi.cb := SizeOf(TStartupInfo);
tsi.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
tsi.hStdInput := hInputRead;
tsi.hStdOutput := hOutputWrite;
tsi.hStdError := hErrorWrite;

if not CreateProcess(nil, PAnsiChar(Cmd), @sa, @sa, true, 0, nil, PAnsiChar(WorkDir), tsi, tpi) then
    exit;

// Close handles we don't need. We are only interested in its output
CloseHandle(hOutputWrite);
CloseHandle(hInputRead);
CloseHandle(hErrorWrite);

repeat
    // ReadFile will never return while our programs waits for input
    if not ReadFile(OutputRead, Buf, SizeOf(Buf), nRead, nil) or (nRead = 0) then
    begin
        if GetLastError = ERROR_BROKEN_PIPE then
            Break
        else
            ErrFunc('Pipe read error, could not execute file');
    end;

    // do something with buf...

until False;

それ自体で終了するのは非常に簡単です (TerminateProcess を使用するだけです)。

4

1 に答える 1

0

まず、Win32 の意味でパイプを使用しておらず、リダイレクトされたコンソール出力を使用しています。
ただし、ファイル ハンドルを待機し、待機がタイムアウトした場合は中止することができます。

于 2013-10-05T17:13:03.410 に答える