Я вызываю функцию из внешней 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;