30. Вызов внешних программ

В Паскаль-пpогpамме можно вызвать внешнюю ^ограмму, котсфая не обяза­тельно должна быть написана на языке Паскаль. Для этого используется проце­дура Exec из модуля DOS:

PROCEDURE Exec(Name,CmdLine: STRING)

Процедура вызывает программу, которая содержится в файле Name (можно задавать полное имя). Этой программе передается командная строка CmdLine, таким образом можно передать информацию вызываемой программе. Если послевызова внешней программы основная программа будет продолжать работу, то необходимо вызвать процедуру

PROCEDURE SwapVectors непосредственно до и непосредственно после процедуры Exec. SwapVectors со­храняет состояние программы в системной области, а затем восстанавливает это состояние. Переменная

VAR DosError: Integer возвращает код завершения внешней программы; при нормальном завершении значение переменной равно 0. Запишем несложный пример использования про­цедуры Exec. Пусть существует внешняя программа, которая "пищит" и окраши­вает экран в заданный цвет: { ТЕКСТ ВНЕШНЕЙ ПРОГРАММЫ }

USES Crt;

VAR Color : Byte; Code : Integer; BEGIN IF ParamCount<>1 THEN Color:=4

ELSE BEGIN Val(ParamStr(1),Color,Code); IF Code<>0 THEN Color:=4; END;

WRITE(#7,#7,#7); Window(1,1,80,25); TextBackground(Color); ClrScr;

END.

Откомпилируем эту программу, записав результат в файл EXT_PRG.EXE. Теперь запишем программу, которая вызовет EXT_PRG.EXE : USES DOS;

BEGIN SwapVectors; Exec('EXT_PRGEXE','1'); SwapVectors; IF DosError=0 THEN WRITELN('OK') ELSE WRITELN('Ошибка номер ',DosError);

END.

Вполне возможно, что, запустив эту программу, мы получим сообщение "ошибка номер 8", этот код завершения означает "не хватает памяти". Дело в том, что процедура Exec пытается использовать память, которую, возможно уже захватила основная программа. В этом случае следует уменьшить размер отво­димой нашей главной программе памяти опцией компилятора {$M}. Синтаксис этой опции таков: {$M размер стека, минимальный размер хипа, максимальный размер хипа}. Добавим в нашу основную программу строку {$M 1024,0,0} - хип в этой программе вообще не нужен, а размер стека в любом случае нельзя задать меньше, чем 1К. Теперь наша программа отработает успешно.