Закрытие канала делает недействительным дескриптор stdout DLL - PullRequest
0 голосов
/ 29 марта 2020

Я вызываю функцию из внешней DLL, которая записывает свой вывод в стандартный вывод. Чтобы получить выходные данные, я создал поток мониторинга, где перенаправляю стандартный вывод в канал, используя CreatePipe и SetStdHandle (код ниже). Проблема в том, что этот код работает только один раз. Если выполняется более одного раза, DLL генерирует исключение «Неверный дескриптор», когда пытается что-то вывести. Я сузил его до линии CloseHandle(PipeWrite). Если я это закомментирую, он начнет работать как задумано. Почему закрытие этого канала навсегда делает недействительным дескриптор стандартного вывода DLL?

const
  SecConst: TSecurityAttributes = (nLength: SizeOf(TSecurityAttributes); bInheritHandle: true);
var
  Security: TSecurityAttributes;
  hStdOld, PipeRead, PipeWrite: THandle;
begin
  Security := SecConst;
  CreatePipe(PipeRead, PipeWrite, @Security, 0);
  hStdOld := GetStdHandle(STD_OUTPUT_HANDLE);
  SetStdHandle(STD_OUTPUT_HANDLE, PipeWrite);

  while not Terminated do
  begin
    if ReadPipe(PipeRead, FOutput) > 0 then
    begin
      Synchronize(SendOutput);
    end;

  end;
  SetStdHandle(STD_OUTPUT_HANDLE, hStdOld);
  CloseHandle(PipeRead);
  CloseHandle(PipeWrite); //problematic call
end;
...