Про закрытие точно не скажу, по крайне мере это было бы логично, с моей точки зрения.
Аналогичные, но иные. Я усомнился, в том, что они вызываются для каждого нового потока и проверил - действительно открываются, но другим методом, отличным от обычного Assign/Reset/Rewrite.
Как же иным, точно таким же, вызовом SysInitStdIO, а последний что вызывает, зависит только от реализации RTL для конкретной ОС. Вообще нет прямой необходимости вызывать ни одину из этих процедур (тут ты прав), главное инициализировать объекты Text (Input, Output).
Например я это делаю так (в своей реализации SysInitStdIO и системного IO):
Код: Выделить всё
TextRec(f).InOutFunc := @WriteStdout;
TextRec(f).FlushFunc := @WriteStdout;
TextRec(f).CloseFunc := @CloseStdout;
Так же, при завершении программы, я вызываю Close для Input и Output, хотя реализация этих моих потоковых устройств, не требует закрытия, т.е. CloseStdout, например, у меня реализован так:
Код: Выделить всё
procedure CloseStdout(var f: TextRec);
begin
end;
Хотя тут мы говорим об одном и том же.
Но я считаю что закрывать все же нужно. Ты не знаешь какая реализация скрывается за этой структурой.
..bw