From: Dmitry RECHKIN <dimer@gis.iems.msk.su>
Subject: Переназначение ввода/вывода для Exec() - для DOS 3.3+ TP6.0+ASM(inline)
Organization: Institute of Economics of Mineral resources
Был тут как-то вопрос о переназначении стандартного ввода для
программ на TP6.0. Так вот, свои соображения на эту тему излагаю в
нижеследующей программе. Не знаю, как из TVision (не пробовал), а
просто в MS DOS 5.0 работает. Если откомпилировать и пустить, будет
веселый эффект.
Если кто будет гонять под TVision - скажите, как оно там. Из
общих соображений должно пахать, но - "... есть многое на свете,
друг Горацио, что и не снилось нашим Паскалям..."
Просьба ко всем, кто будет брать - черкните отзыв, интересно
знать мнение коллег, знаете ли...
С лучшими пожеланиями -
Д.Речкин (dimer@gis.iems.msk.su)
{> Cut here. FileName= REDIR.PAS }
{$M 8191,0,0}
program RedirectionDemo;
{ Запускать - только из ДОСа !!! }
uses DOS;
const { Стандартные дескрипторы ДОСа ------------------- }
StdIn : Word = 0; { стандартный ввод - то, что прет с кнопок }
StdOut: Word = 1; { стандартный вывод - обычно на экран }
StdErr: Word = 2; { стандартные сообщения - обычно на экран }
var
f : Text;
InH : Word;
procedure RedirHandle (Src, Dst: Word);
{ RedirHandle - переназначение операций ввода-вывода через
дескрипторы (handle); действие переназначения сохраняется
до завершения текущего процесса и распространяется на все
процессы, порожденные данным (через exec и т.п.)
Src - дескриптор, который надо переназначить;
Dst - собственный дескриптор, определенный в программе,
на который надо переназначить операции ввода-вывода. }
var
Source, Target : Word;
begin
Source := Src;
Target := Dst;
asm
mov ah, 46h
mov bx, Target
mov cx, Source
int 21h
end
end;
begin { тело программы }
{ сначала надо открыть файл, для которого будет делаться
переназначение }
Assign (f, 'redirect.pas');
Reset (f);
{ теперь надо узнать его дескриптор в системе (handle) }
InH := TextRec(f).Handle;
{ и можно переназначать - процедура для этого есть }
RedirHandle (StdIn,InH);
{ после этого StdIn переназначен на файл с дескриптором InH }
Writeln ('********** Перед EXEC с переназначением ...');
SwapVectors;
Exec (GetEnv(
|